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". Tested powerpc64le-linux, committed to trunk.
commit 19063895cfbcc33e0f8bbe2a04d048db18395727 Author: Jonathan Wakely <jwak...@redhat.com> Date: Thu May 23 22:13:35 2019 +0100 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". 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<abstract>())), "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<abstract>())), - "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<void>(std::declval<abstract>())), - "It should be possible to use abstract types with INVOKE<R>" ); -#endif struct F { void operator()() &; @@ -48,19 +39,3 @@ static_assert( !noexcept(std::__invoke(std::declval<F&>())), "" ); static_assert( noexcept(std::__invoke(std::declval<F>())), "" ); static_assert( !noexcept(std::__invoke(std::declval<F>(), 1)), "" ); static_assert( noexcept(std::__invoke(std::declval<F>(), 1, 2)), "" ); - -#if __cpp_lib_invoke -static_assert( !noexcept(std::invoke(std::declval<F&>())), "" ); -static_assert( noexcept(std::invoke(std::declval<F>())), "" ); -static_assert( !noexcept(std::invoke(std::declval<F>(), 1)), "" ); -static_assert( noexcept(std::invoke(std::declval<F>(), 1, 2)), "" ); - -static_assert( !noexcept(std::__invoke_r<void>(std::declval<F&>())), "" ); -static_assert( noexcept(std::__invoke_r<void>(std::declval<F>())), "" ); -static_assert( !noexcept(std::__invoke_r<int>(std::declval<F>(), 1)), "" ); -static_assert( !noexcept(std::__invoke_r<void>(std::declval<F>(), 1)), "" ); -static_assert( !noexcept(std::__invoke_r<long>(std::declval<F>(), 1)), "" ); -static_assert( noexcept(std::__invoke_r<void>(std::declval<F>(), 1, 2)), "" ); -static_assert( noexcept(std::__invoke_r<void*>(std::declval<F>(), 1, 2)), "" ); -static_assert( noexcept(std::__invoke_r<D>(std::declval<F>(), 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 +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include <functional> + +struct abstract { + virtual ~abstract() = 0; + void operator()() noexcept; +}; + +static_assert( noexcept(std::__invoke(std::declval<abstract>())), + "It should be possible to use abstract types with INVOKE" ); +static_assert( noexcept(std::invoke(std::declval<abstract>())), + "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<void>(std::declval<abstract>())), + "It should be possible to use abstract types with INVOKE<R>" ); + +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<F&>())), "" ); +static_assert( noexcept(std::__invoke(std::declval<F>())), "" ); +static_assert( !noexcept(std::__invoke(std::declval<F>(), 1)), "" ); +static_assert( noexcept(std::__invoke(std::declval<F>(), 1, 2)), "" ); + +static_assert( !noexcept(std::invoke(std::declval<F&>())), "" ); +static_assert( noexcept(std::invoke(std::declval<F>())), "" ); +static_assert( !noexcept(std::invoke(std::declval<F>(), 1)), "" ); +static_assert( noexcept(std::invoke(std::declval<F>(), 1, 2)), "" ); + +static_assert( !noexcept(std::__invoke_r<void>(std::declval<F&>())), "" ); +static_assert( noexcept(std::__invoke_r<void>(std::declval<F>())), "" ); +static_assert( !noexcept(std::__invoke_r<int>(std::declval<F>(), 1)), "" ); +static_assert( !noexcept(std::__invoke_r<void>(std::declval<F>(), 1)), "" ); +static_assert( !noexcept(std::__invoke_r<long>(std::declval<F>(), 1)), "" ); +static_assert( noexcept(std::__invoke_r<void>(std::declval<F>(), 1, 2)), "" ); +static_assert( noexcept(std::__invoke_r<void*>(std::declval<F>(), 1, 2)), "" ); +static_assert( !noexcept(std::__invoke_r<D>(std::declval<F>(), 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 // <http://www.gnu.org/licenses/>. -// { dg-do compile { target c++11 } } +// { dg-do run { target c++11 } } #include <unordered_set> #include <memory>