diff options
-rw-r--r-- | libcxx/include/type_traits | 12 | ||||
-rw-r--r-- | libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_assign.pass.cpp | 45 |
2 files changed, 20 insertions, 37 deletions
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 0f45f489dab..2aedd604176 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -769,20 +769,14 @@ template <class _Tp> struct has_copy_assign; #if defined(__clang__) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 3) -template <class _Tp, bool = is_void<_Tp>::value> -struct __has_trivial_copy_assign - : public integral_constant<bool, __has_trivial_assign(_Tp)> {}; - -template <class _Tp> struct __has_trivial_copy_assign<_Tp, true> - : public false_type {}; - template <class _Tp> struct has_trivial_copy_assign - : __has_trivial_copy_assign<_Tp> {}; + : public integral_constant<bool, __has_trivial_assign(_Tp)> {}; #else template <class _Tp> struct has_trivial_copy_assign - : public integral_constant<bool, is_scalar<_Tp>::value && !is_const<_Tp>::value> {}; + : public integral_constant<bool, is_scalar<_Tp>::value && + !is_const<_Tp>::value> {}; #endif // defined(__clang__) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 3) diff --git a/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_assign.pass.cpp b/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_assign.pass.cpp index 9993cbdcdc0..061277a1cc4 100644 --- a/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_assign.pass.cpp +++ b/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_assign.pass.cpp @@ -13,22 +13,10 @@ #include <type_traits> -template <class T> +template <class T, bool Result> void test_has_trivial_assign() { - static_assert( std::has_trivial_copy_assign<T>::value, ""); - static_assert(!std::has_trivial_copy_assign<const T>::value, ""); - static_assert( std::has_trivial_copy_assign<volatile T>::value, ""); - static_assert(!std::has_trivial_copy_assign<const volatile T>::value, ""); -} - -template <class T> -void test_has_not_trivial_assign() -{ - static_assert(!std::has_trivial_copy_assign<T>::value, ""); - static_assert(!std::has_trivial_copy_assign<const T>::value, ""); - static_assert(!std::has_trivial_copy_assign<volatile T>::value, ""); - static_assert(!std::has_trivial_copy_assign<const volatile T>::value, ""); + static_assert(std::has_trivial_copy_assign<T>::value == Result, ""); } class Empty @@ -59,19 +47,20 @@ struct A int main() { - test_has_not_trivial_assign<void>(); - test_has_not_trivial_assign<A>(); - test_has_not_trivial_assign<int&>(); - test_has_not_trivial_assign<NotEmpty>(); - test_has_not_trivial_assign<Abstract>(); + test_has_trivial_assign<void, false>(); + test_has_trivial_assign<A, false>(); + test_has_trivial_assign<int&, false>(); + test_has_trivial_assign<NotEmpty, false>(); + test_has_trivial_assign<Abstract, false>(); + test_has_trivial_assign<const Empty, false>(); + test_has_trivial_assign<char[3], false>(); + test_has_trivial_assign<char[], false>(); - test_has_trivial_assign<Union>(); - test_has_trivial_assign<Empty>(); - test_has_trivial_assign<int>(); - test_has_trivial_assign<double>(); - test_has_trivial_assign<int*>(); - test_has_trivial_assign<const int*>(); - test_has_trivial_assign<char[3]>(); - test_has_trivial_assign<char[3]>(); - test_has_trivial_assign<bit_zero>(); + test_has_trivial_assign<Union, true>(); + test_has_trivial_assign<Empty, true>(); + test_has_trivial_assign<int, true>(); + test_has_trivial_assign<double, true>(); + test_has_trivial_assign<int*, true>(); + test_has_trivial_assign<const int*, true>(); + test_has_trivial_assign<bit_zero, true>(); } |