[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