PR78991 make __gnu_cxx::__ops constructors explicit

Message ID
State New
Headers show

Commit Message

Jonathan Wakely Jan. 9, 2017, 11:04 a.m.
On 09/01/17 10:47 +0000, Jonathan Wakely wrote:
>On 09/01/17 10:39 +0000, Kyrill Tkachov wrote:

>>Hi Jonathan,


>>On 06/01/17 12:40, Jonathan Wakely wrote:

>>>This solves a problem when using libstdc++ with Clang, due to Clang

>>>more eagerly instantiating constexpr function templates during

>>>argument deduction. G++ has some shortcuts to avoid this problem, but

>>>Clang doesn't, and it's not clear that it's strictly speaking a bug in

>>>Clang or if it's following the standard. By making these constructors

>>>explicit we stop them being considered by overload resolution for

>>>copying these functors, which stops us ending up back in the

>>>std::function SFINAE checks.


>>>I'm also using _GLIBCXX_MOVE to turn some internal copies into moves,

>>>because otherwise using something like std::function with <algorithm>

>>>results in a number of potentially expensive copies.


>>>   PR libstdc++/78991

>>>   * include/bits/predefined_ops.h (_Iter_comp_iter, _Iter_comp_val)

>>>   (_Val_comp_iter, _Iter_equals_val, _Iter_pred, _Iter_comp_to_val)

>>>   (_Iter_comp_to_iter, _Iter_negate): Make constructors explicit and

>>>   move function objects.

>>>   (__iter_comp_iter, __iter_comp_val, __val_comp_iter, __pred_iter)

>>>   (__iter_comp_val, __iter_comp_iter, __negate): Move function objects.

>>>   * testsuite/25_algorithms/sort/ New test.


>>>Tested powerpc64le-linux, committed to trunk.


>>>I'll backport  the 'explicit' constructors (but not the _GLIBCXX_MOVE

>>>changes) to the branches too.



>>I see this test fail on the GCC 5 branch on arm and aarch64 (error message pasted below).

>>Does the test need a gnu++11 guard or something on the branch?


>I thought I'd changed that before committing, I'll fix it.

Committed to gcc-5-branch.


commit 366c9e60ffa0536ab87de4e70ec807c2eb5fb66b
Author: Jonathan Wakely <>
Date:   Mon Jan 9 10:54:44 2017 +0000

    Add missing dg-options to C++14 test
    	* testsuite/25_algorithms/sort/ Compile with -std=gnu++14.

diff --git a/libstdc++-v3/testsuite/25_algorithms/sort/ b/libstdc++-v3/testsuite/25_algorithms/sort/
index d947538..260878e 100644
--- a/libstdc++-v3/testsuite/25_algorithms/sort/
+++ b/libstdc++-v3/testsuite/25_algorithms/sort/
@@ -15,6 +15,7 @@ 
 // with this library; see the file COPYING3.  If not see
 // <>.
+// { dg-options "-std=gnu++14" }
 // { dg-do compile }
 // PR 78991