diff mbox

PR78361 recognise noexcept functions as referenceable

Message ID 20170113121823.GA22639@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Jan. 13, 2017, 12:18 p.m. UTC
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 <jwakely@redhat.com>
Date:   Fri Jan 13 11:47:29 2017 +0000

    PR78361 recognise noexcept functions as referenceable
    
    2017-01-13  Jonathan Wakely  <jwakely@redhat.com>
    
    	PR libstdc++/78361
    	* testsuite/20_util/add_pointer/value.cc: Test forming function
    	pointers.
    
    2017-01-13  Michael Brune  <lucdanton@free.fr>
    
    	PR libstdc++/78361
    	* include/std/type_traits (__is_referenceable): Handle noexcept
    	function types.
diff mbox

Patch

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, "");
+}