rsmith created this revision.
rsmith added reviewers: EricWF, mclow.lists.
Herald added a subscriber: cfe-commits.

Teach libcxx to stop using various deprecated __has_* type traits, in favor of 
the ("modern", C++11 era) __is_* type traits.

This is mostly just a simplification, but fixes at least one bug: `_Atomic T` 
should be considered trivially-destructible, but is not considered to be POD by 
Clang, and `__has_trivial_destructor` is specified in the GCC documentation as 
returning `false` for non-POD non-class types.


Repository:
  rCXX libc++

https://reviews.llvm.org/D48292

Files:
  include/type_traits
  
test/std/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp

Index: test/std/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp
===================================================================
--- test/std/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp
+++ test/std/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp
@@ -116,4 +116,12 @@
     test_is_not_trivially_destructible<PureProtectedDestructor>();
     test_is_not_trivially_destructible<PurePrivateDestructor>();
 #endif
+
+#if defined(__is_identifier)
+#if !__is_identifier(_Atomic)
+    test_is_trivially_destructible<_Atomic int>();
+    test_is_trivially_destructible<_Atomic float>();
+    test_is_trivially_destructible<_Atomic int*>();
+#endif
+#endif
 }
Index: include/type_traits
===================================================================
--- include/type_traits
+++ include/type_traits
@@ -3675,9 +3675,14 @@
 
 // is_trivially_destructible
 
-#if __has_feature(has_trivial_destructor) || (_GNUC_VER >= 403)
+#if __has_keyword(__is_trivially_destructible)
 
 template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
+    : public integral_constant<bool, __is_trivially_destructible(_Tp)> {};
+
+#elif __has_feature(has_trivial_destructor) || (_GNUC_VER >= 403)
+
+template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
     : public integral_constant<bool, is_destructible<_Tp>::value && __has_trivial_destructor(_Tp)> {};
 
 #else
@@ -3702,19 +3707,16 @@
 
 // is_nothrow_constructible
 
-#if 0
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+
+#if __has_keyword(__is_nothrow_constructible)
+
 template <class _Tp, class... _Args>
 struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
-    : public integral_constant<bool, __is_nothrow_constructible(_Tp(_Args...))>
-{
-};
+    : public integral_constant<bool, __is_nothrow_constructible(_Tp, _Args...)> {};
 
-#else
+#elif __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
 
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
-
 template <bool, bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
 
 template <class _Tp, class... _Args>
@@ -3750,7 +3752,7 @@
 {
 };
 
-#else  // __has_feature(cxx_noexcept)
+#else  // __has_keyword(__is_nothrow_constructible) || __has_feature(cxx_noexcept)
 
 template <class _Tp, class... _Args>
 struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
@@ -3806,9 +3808,26 @@
 
 #else  // _LIBCPP_HAS_NO_VARIADICS
 
+#if __has_keyword(__is_nothrow_constructible)
+
 template <class _Tp, class _A0 = __is_construct::__nat,
                      class _A1 = __is_construct::__nat>
 struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
+    : public integral_constant<bool, __is_nothrow_constructible(_Tp, _A0, _A1)> {};
+
+template <class _Tp, class _A0>
+struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _A0>
+    : public integral_constant<bool, __is_nothrow_constructible(_Tp, _A0)> {};
+
+template <class _Tp>
+struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp>
+    : public integral_constant<bool, __is_nothrow_constructible(_Tp)> {};
+
+#else  // __has_keyword(__is_nothrow_constructible)
+
+template <class _Tp, class _A0 = __is_construct::__nat,
+                     class _A1 = __is_construct::__nat>
+struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
     : false_type
 {
 };
@@ -3857,8 +3876,8 @@
 {
 };
 
+#endif  // __has_keyword(__is_nothrow_constructible)
 #endif  // _LIBCPP_HAS_NO_VARIADICS
-#endif  // __has_feature(is_nothrow_constructible)
 
 #if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
 template <class _Tp, class ..._Args>
@@ -3908,8 +3927,14 @@
 
 // is_nothrow_assignable
 
-#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
+#if __has_keyword(__is_nothrow_assignable)
 
+template <class _Tp, class _Arg>
+struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
+    : public integral_constant<bool, __is_nothrow_assignable(_Tp, _Arg)> {};
+
+#elif __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
+
 template <bool, class _Tp, class _Arg> struct __libcpp_is_nothrow_assignable;
 
 template <class _Tp, class _Arg>
@@ -3930,7 +3955,7 @@
 {
 };
 
-#else  // __has_feature(cxx_noexcept)
+#else  // __has_keyword(__is_nothrow_assignable) || __has_feature(cxx_noexcept)
 
 template <class _Tp, class _Arg>
 struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to