This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR78991 make __gnu_cxx::__ops constructors explicit



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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]