This ensures that __is_referenceable gives the right answer for functions with noexcept in the type, which exist in C++17.
I'll also review the stuff in <functional> for similar problems. Tested powerpc64le-linux, -std=gnu++{14,17}, committed to trunk.
commit 7029af834c490402beaab6336a1d11d286f65cc8 Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Jan 13 11:47:29 2017 +0000 PR78361 recognise noexcept functions as referenceable 2017-01-13 Jonathan Wakely <jwak...@redhat.com> PR libstdc++/78361 * testsuite/20_util/add_pointer/value.cc: Test forming function pointers. 2017-01-13 Michael Brune <lucdan...@free.fr> PR libstdc++/78361 * include/std/type_traits (__is_referenceable): Handle noexcept function types. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index d0fa390..a50f06c 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -641,13 +641,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : public __or_<is_object<_Tp>, is_reference<_Tp>>::type { }; - template<typename _Res, typename... _Args> - struct __is_referenceable<_Res(_Args...)> + template<typename _Res, typename... _Args _GLIBCXX_NOEXCEPT_PARM> + struct __is_referenceable<_Res(_Args...) _GLIBCXX_NOEXCEPT_QUAL> : public true_type { }; - template<typename _Res, typename... _Args> - struct __is_referenceable<_Res(_Args......)> + template<typename _Res, typename... _Args _GLIBCXX_NOEXCEPT_PARM> + struct __is_referenceable<_Res(_Args......) _GLIBCXX_NOEXCEPT_QUAL> : public true_type { }; diff --git a/libstdc++-v3/testsuite/20_util/add_pointer/value.cc b/libstdc++-v3/testsuite/20_util/add_pointer/value.cc index e0688cb..a2f1e67 100644 --- a/libstdc++-v3/testsuite/20_util/add_pointer/value.cc +++ b/libstdc++-v3/testsuite/20_util/add_pointer/value.cc @@ -34,3 +34,18 @@ void test01() ClassType**>::value, ""); static_assert(is_same<add_pointer<ClassType>::type, ClassType*>::value, ""); } + +void test02() +{ + using std::add_pointer; + using std::is_same; + + void f1(); + using f1_type = decltype(f1); + using pf1_type = decltype(&f1); + static_assert(is_same<add_pointer<f1_type>::type, pf1_type>::value, ""); + void f2() noexcept; // PR libstdc++/78361 + using f2_type = decltype(f2); + using pf2_type = decltype(&f2); + static_assert(is_same<add_pointer<f2_type>::type, pf2_type>::value, ""); +}