From 5f303216e5e321f759a88c7c1cbffd84b0997ead Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 23 May 2019 22:41:08 +0100 Subject: [PATCH] Fix testsuite bugs One of the static assertions in 20_util/function_objects/invoke/1.cc was wrong, but didn't fail because by default it was compiled with -std=gnu++14 which didn't use that static assertion. Split out the C++17 parts to a new file that always runs with -std=gnu++17, so those checks are always done. The 23_containers/unordered_set/allocator/ext_ptr.cc test is supposed to be a run-time test but was unintentionally compile-only. * testsuite/20_util/function_objects/invoke/1.cc: Move C++17-specific tests to ... * testsuite/20_util/function_objects/invoke/3.cc: New test. * testsuite/23_containers/unordered_set/allocator/ext_ptr.cc: Change "compile" test to "run". From-SVN: r271584 --- libstdc++-v3/ChangeLog | 6 ++ .../20_util/function_objects/invoke/1.cc | 25 -------- .../20_util/function_objects/invoke/3.cc | 62 +++++++++++++++++++ .../unordered_set/allocator/ext_ptr.cc | 2 +- 4 files changed, 69 insertions(+), 26 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/function_objects/invoke/3.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 48b519e9cd0..90043c55f1a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,11 @@ 2019-05-23 Jonathan Wakely + * testsuite/20_util/function_objects/invoke/1.cc: Move C++17-specific + tests to ... + * testsuite/20_util/function_objects/invoke/3.cc: New test. + * testsuite/23_containers/unordered_set/allocator/ext_ptr.cc: Change + "compile" test to "run". + * doc/xml/manual/intro.xml: Document LWG DR 2996 change. * doc/html/*: Regenerate. * include/bits/shared_ptr.h (shared_ptr(shared_ptr&&, T*)): Add diff --git a/libstdc++-v3/testsuite/20_util/function_objects/invoke/1.cc b/libstdc++-v3/testsuite/20_util/function_objects/invoke/1.cc index 9af7b294130..fe8d681e87b 100644 --- a/libstdc++-v3/testsuite/20_util/function_objects/invoke/1.cc +++ b/libstdc++-v3/testsuite/20_util/function_objects/invoke/1.cc @@ -26,15 +26,6 @@ struct abstract { static_assert( noexcept(std::__invoke(std::declval())), "It should be possible to use abstract types with INVOKE" ); -#if __cpp_lib_invoke -// std::invoke is only defined since C++17. -static_assert( noexcept(std::invoke(std::declval())), - "It should be possible to use abstract types with INVOKE" ); - -// The std::__invoke_r extension only has a noexcept-specifier for >= C++17. -static_assert( noexcept(std::__invoke_r(std::declval())), - "It should be possible to use abstract types with INVOKE" ); -#endif struct F { void operator()() &; @@ -48,19 +39,3 @@ static_assert( !noexcept(std::__invoke(std::declval())), "" ); static_assert( noexcept(std::__invoke(std::declval())), "" ); static_assert( !noexcept(std::__invoke(std::declval(), 1)), "" ); static_assert( noexcept(std::__invoke(std::declval(), 1, 2)), "" ); - -#if __cpp_lib_invoke -static_assert( !noexcept(std::invoke(std::declval())), "" ); -static_assert( noexcept(std::invoke(std::declval())), "" ); -static_assert( !noexcept(std::invoke(std::declval(), 1)), "" ); -static_assert( noexcept(std::invoke(std::declval(), 1, 2)), "" ); - -static_assert( !noexcept(std::__invoke_r(std::declval())), "" ); -static_assert( noexcept(std::__invoke_r(std::declval())), "" ); -static_assert( !noexcept(std::__invoke_r(std::declval(), 1)), "" ); -static_assert( !noexcept(std::__invoke_r(std::declval(), 1)), "" ); -static_assert( !noexcept(std::__invoke_r(std::declval(), 1)), "" ); -static_assert( noexcept(std::__invoke_r(std::declval(), 1, 2)), "" ); -static_assert( noexcept(std::__invoke_r(std::declval(), 1, 2)), "" ); -static_assert( noexcept(std::__invoke_r(std::declval(), 1, 2)), "" ); -#endif diff --git a/libstdc++-v3/testsuite/20_util/function_objects/invoke/3.cc b/libstdc++-v3/testsuite/20_util/function_objects/invoke/3.cc new file mode 100644 index 00000000000..75cc1e126c3 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_objects/invoke/3.cc @@ -0,0 +1,62 @@ +// Copyright (C) 2016-2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +struct abstract { + virtual ~abstract() = 0; + void operator()() noexcept; +}; + +static_assert( noexcept(std::__invoke(std::declval())), + "It should be possible to use abstract types with INVOKE" ); +static_assert( noexcept(std::invoke(std::declval())), + "It should be possible to use abstract types with INVOKE" ); + +// The std::__invoke_r extension only has a noexcept-specifier for >= C++17. +static_assert( noexcept(std::__invoke_r(std::declval())), + "It should be possible to use abstract types with INVOKE" ); + +struct F { + void operator()() &; + void operator()() && noexcept; + int operator()(int); + double* operator()(int, int) noexcept; +}; +struct D { D(void*); }; + +static_assert( !noexcept(std::__invoke(std::declval())), "" ); +static_assert( noexcept(std::__invoke(std::declval())), "" ); +static_assert( !noexcept(std::__invoke(std::declval(), 1)), "" ); +static_assert( noexcept(std::__invoke(std::declval(), 1, 2)), "" ); + +static_assert( !noexcept(std::invoke(std::declval())), "" ); +static_assert( noexcept(std::invoke(std::declval())), "" ); +static_assert( !noexcept(std::invoke(std::declval(), 1)), "" ); +static_assert( noexcept(std::invoke(std::declval(), 1, 2)), "" ); + +static_assert( !noexcept(std::__invoke_r(std::declval())), "" ); +static_assert( noexcept(std::__invoke_r(std::declval())), "" ); +static_assert( !noexcept(std::__invoke_r(std::declval(), 1)), "" ); +static_assert( !noexcept(std::__invoke_r(std::declval(), 1)), "" ); +static_assert( !noexcept(std::__invoke_r(std::declval(), 1)), "" ); +static_assert( noexcept(std::__invoke_r(std::declval(), 1, 2)), "" ); +static_assert( noexcept(std::__invoke_r(std::declval(), 1, 2)), "" ); +static_assert( !noexcept(std::__invoke_r(std::declval(), 1, 2)), "" ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/ext_ptr.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/ext_ptr.cc index 707e6d27d00..5daa456e440 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/ext_ptr.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/ext_ptr.cc @@ -15,7 +15,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-do compile { target c++11 } } +// { dg-do run { target c++11 } } #include #include -- 2.30.2