[PATCH] support N4514 in <type_traits> is_function

Barrett Adair barrettellisadair@gmail.com
Wed Feb 15 02:37:00 GMT 2017


Hi,

is_function doesn't currently account for the language changes in
N4514 (i.e. the -fgnu-tm flag).

Would something like this patch be desirable? I asked about this on SO
a few weeks ago and received no answers:
http://stackoverflow.com/questions/41293925

I see nothing glaring in this patch, but I also haven't set up the
test suite tonight... So take this FWIW.

Thanks,
Barrett
-------------- next part --------------
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index e88fe2d..7cf8f49 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-14  Barrett Adair  <barrettellisadair@gmail.com>
+
+	* include/std/type_traits: Support N4514 in is_function.
+	* testsuite/20_util/is_function/value.cc: Add test case.
+
 2017-02-13  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR libstdc++/79348
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 3e2014e..917b556 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -554,6 +554,106 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct is_function<_Res(_ArgTypes......) const volatile && _GLIBCXX_NOEXCEPT_QUAL>
     : public true_type { };
 
+#ifdef __cpp_transactional_memory
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...)
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......)
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) const
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) const &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) const &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) const
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) const &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) const &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) volatile
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) volatile &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) volatile &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) volatile
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) volatile &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) volatile &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) const volatile
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) const volatile &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes...) const volatile &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) const volatile
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) const volatile &
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
+    struct is_function<_Res(_ArgTypes......) const volatile &&
+    	transaction_safe _GLIBCXX_NOEXCEPT_QUAL> : public true_type { };
+
+#endif
+
 #define __cpp_lib_is_null_pointer 201309
 
   template<typename>
diff --git a/libstdc++-v3/testsuite/20_util/is_function/value.cc b/libstdc++-v3/testsuite/20_util/is_function/value.cc
index 692e769..f88a463 100644
--- a/libstdc++-v3/testsuite/20_util/is_function/value.cc
+++ b/libstdc++-v3/testsuite/20_util/is_function/value.cc
@@ -36,6 +36,11 @@ void test01()
   static_assert(test_category<is_function,
 		char (int, ClassType) const volatile &&>(true), "");
 
+#ifdef __cpp_transactional_memory
+  static_assert(test_category<is_function,
+    char (int, ClassType) const & transaction_safe>(true), "");
+#endif
+
   // Negative tests.
   static_assert(test_category<is_function, int&>(false), "");
   static_assert(test_category<is_function, void>(false), "");


More information about the Libstdc++ mailing list