[PATCH] PR78991 make __gnu_cxx::__ops constructors explicit

Kyrill Tkachov kyrylo.tkachov@foss.arm.com
Mon Jan 9 11:05:00 GMT 2017


On 09/01/17 10:47, 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/78991.cc: 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.
>
Thanks.
Also, I think 30_threads/thread/cons/lwg2097.cc needs something similar.
I see it failing on the GCC 5 branch with:

In file included from $BLD/aarch64-unknown-linux-gnu/libstdc++-v3/include/thread:35:0,
                  from $SRC/libstdc++-v3/testsuite/30_threads/thread/cons/lwg2097.cc:22:
$BLD/aarch64-unknown-linux-gnu/libstdc++-v3/include/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must
  be enabled with the -std=c++11 or -std=gnu++11 compiler options.
  #error This file requires compiler and library support \
   ^
$SRC/libstdc++-v3/testsuite/30_threads/thread/cons/lwg2097.cc:24:12: error: 'std::thread' has not been declared
  using std::thread;
             ^
$SRC/libstdc++-v3/testsuite/30_threads/thread/cons/lwg2097.cc:25:12: error: 'std::is_constructible' has not been declared
  using std::is_constructible;
             ^
$SRC/libstdc++-v3/testsuite/30_threads/thread/cons/lwg2097.cc:27:14: error: expected constructor, destructor, or type conversion before '(' token
  static_assert( !is_constructible<thread, thread&>::value, "" );
               ^
$SRC/libstdc++-v3/testsuite/30_threads/thread/cons/lwg2097.cc:28:14: error: expected constructor, destructor, or type conversion before '(' token
  static_assert( !is_constructible<thread, const thread&>::value, "" );
               ^
$SRC/libstdc++-v3/testsuite/30_threads/thread/cons/lwg2097.cc:29:14: error: expected constructor, destructor, or type conversion before '(' token
  static_assert( !is_constructible<thread, const thread>::value, "" );
               ^

FAIL: 30_threads/thread/cons/lwg2097.cc (test for excess errors)



More information about the Libstdc++ mailing list