diff options
Diffstat (limited to 'libcxx')
5 files changed, 39 insertions, 9 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config index a5a2d1f0ef7..87213fcbdfe 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -152,6 +152,10 @@ using namespace _LIBCPP_NAMESPACE; #define _STD std #endif // __has_feature(cxx_inline_namespaces) +#if !(__has_feature(cxx_constexpr)) +#define _LIBCPP_HAS_NO_CONSTEXPR +#endif + // end defined(__clang__) #elif defined(__GNUC__) @@ -161,6 +165,7 @@ using namespace _LIBCPP_NAMESPACE; #endif #define _LIBCPP_HAS_NO_TEMPLATE_ALIASES +#define _LIBCPP_HAS_NO_CONSTEXPR #ifndef __GXX_EXPERIMENTAL_CXX0X__ @@ -231,4 +236,8 @@ template <unsigned> struct __static_assert_check {}; #define decltype(x) __typeof__(x) #endif +#ifdef _LIBCPP_HAS_NO_CONSTEXPR +#define constexpr const +#endif + #endif // _LIBCPP_CONFIG diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 5cdcf12f237..5624c4ec18f 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -34,7 +34,6 @@ namespace std template <class T> struct is_pointer; template <class T> struct is_lvalue_reference; template <class T> struct is_rvalue_reference; - template <class T> struct is_reference; template <class T> struct is_member_object_pointer; template <class T> struct is_member_function_pointer; template <class T> struct is_enum; @@ -152,9 +151,12 @@ struct __two {char _[2];}; template <class _Tp, _Tp __v> struct integral_constant { - static const _Tp value = __v; + static constexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant type; +#ifndef _LIBCPP_HAS_NO_CONSTEXPR + constexpr operator value_type() {return value;} +#endif }; template <class _Tp, _Tp __v> @@ -258,7 +260,7 @@ template <class _Tp> struct is_reference<_Tp&&> : public true_type {}; // is_union -#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 +#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 || defined(__clang__) template <class _Tp> struct is_union : public integral_constant<bool, __is_union(_Tp)> {}; @@ -725,13 +727,30 @@ template <class _Tp> struct has_nothrow_move_constructor : public has_nothrow_co template <class _Tp> struct has_copy_constructor : public true_type {}; +// has_copy_assign + +template <class _Tp> struct has_copy_assign; + // has_trivial_copy_assign -template <class _Tp> struct __libcpp_trivial_copy_assign : public integral_constant<bool, !is_const<_Tp>::value && - is_scalar<_Tp>::value> {}; +#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 - : public __libcpp_trivial_copy_assign<typename remove_all_extents<_Tp>::type> {}; + : __has_trivial_copy_assign<_Tp> {}; + +#else + +template <class _Tp> struct has_trivial_copy_assign + : public integral_constant<bool, is_scalar<_Tp>::value && !is_const<_Tp>::value> {}; + +#endif // defined(__clang__) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 3) // has_nothrow_copy_assign diff --git a/libcxx/test/utilities/meta/meta.hel/integral_constant.pass.cpp b/libcxx/test/utilities/meta/meta.hel/integral_constant.pass.cpp index 47b8eaf18b2..8575cd332a0 100644 --- a/libcxx/test/utilities/meta/meta.hel/integral_constant.pass.cpp +++ b/libcxx/test/utilities/meta/meta.hel/integral_constant.pass.cpp @@ -12,6 +12,7 @@ // integral_constant #include <type_traits> +#include <cassert> int main() { @@ -19,6 +20,7 @@ int main() static_assert(_5::value == 5, ""); static_assert((std::is_same<_5::value_type, int>::value), ""); static_assert((std::is_same<_5::type, _5>::value), ""); + static_assert((_5() == 5), ""); static_assert(std::false_type::value == false, ""); static_assert((std::is_same<std::false_type::value_type, bool>::value), ""); diff --git a/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_copy_assign.pass.cpp b/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_copy_assign.pass.cpp index 787cd79c3e2..83753752176 100644 --- a/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_copy_assign.pass.cpp +++ b/libcxx/test/utilities/meta/meta.unary/meta.unary.prop/has_copy_assign.pass.cpp @@ -15,5 +15,5 @@ int main() { -#error has_copy_assign not implemented + static_assert((std::has_copy_assign<int>::value), ""); } 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 762bd511479..9993cbdcdc0 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 @@ -62,9 +62,10 @@ 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<Union>(); - test_has_trivial_assign<Abstract>(); test_has_trivial_assign<Empty>(); test_has_trivial_assign<int>(); test_has_trivial_assign<double>(); @@ -72,6 +73,5 @@ int main() test_has_trivial_assign<const int*>(); test_has_trivial_assign<char[3]>(); test_has_trivial_assign<char[3]>(); - test_has_trivial_assign<NotEmpty>(); test_has_trivial_assign<bit_zero>(); } |

