summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libcxx/include/type_traits12
-rw-r--r--libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_assign.pass.cpp45
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>();
}
OpenPOWER on IntegriCloud