From cc06c7f652d7fede4844eb1cc21b65d5c8e4efcc Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 13 Oct 2016 11:19:24 +0100 Subject: Fix exception-specifications for std::_Not_fn * include/std/functional (_Not_fn): Make exception specifications depend on whether negating the result can throw. * testsuite/20_util/not_fn/1.cc: Move to ... * testsuite/20_util/function_objects/not_fn/1.cc: ... here. Add tests for types that can throw when negated and that cannot be negated. From-SVN: r241091 --- libstdc++-v3/include/std/functional | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'libstdc++-v3/include/std') diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 6a45314..58134b7 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -2140,6 +2140,16 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template class _Not_fn { + template + using __is_nothrow_negatable + = __bool_constant())>; + + template + using __noexcept_cond = __and_< + __is_nothrow_callable<_Fn2(_Args&&...)>, + __is_nothrow_negatable> + >; + public: template _Not_fn(_Fn2&& __fn, int) @@ -2152,21 +2162,21 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template auto operator()(_Args&&... __args) & - noexcept(__is_nothrow_callable<_Fn&(_Args&&...)>::value) + noexcept(__noexcept_cond<_Fn&, _Args&&...>::value) -> decltype(!std::declval>()) { return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); } template auto operator()(_Args&&... __args) const & - noexcept(__is_nothrow_callable::value) + noexcept(__noexcept_cond::value) -> decltype(!std::declval>()) { return !std::__invoke(_M_fn, std::forward<_Args>(__args)...); } template auto operator()(_Args&&... __args) && - noexcept(__is_nothrow_callable<_Fn&&(_Args&&...)>::value) + noexcept(__noexcept_cond<_Fn&&, _Args&&...>::value) -> decltype(!std::declval>()) { return !std::__invoke(std::move(_M_fn), @@ -2176,7 +2186,7 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template auto operator()(_Args&&... __args) const && - noexcept(__is_nothrow_callable::value) + noexcept(__noexcept_cond::value) -> decltype(!std::declval>()) { return !std::__invoke(std::move(_M_fn), -- cgit v1.1