diff --git a/include/type_traits b/include/type_traits index 819de786..505647e0 100644 --- a/include/type_traits +++ b/include/type_traits @@ -129,7 +129,6 @@ namespace std template struct alignment_of; template struct aligned_storage; - template struct aligned_union; template struct decay; template struct common_type; @@ -169,11 +168,15 @@ struct _LIBCPP_VISIBLE integral_constant #ifndef _LIBCPP_HAS_NO_CONSTEXPR constexpr #endif - operator value_type() const {return value;} + operator value_type() +#ifdef _LIBCPP_HAS_NO_CONSTEXPR + const +#endif + {return value;} }; template -const _Tp integral_constant<_Tp, __v>::value; +constexpr _Tp integral_constant<_Tp, __v>::value; typedef integral_constant true_type; typedef integral_constant false_type; @@ -1200,7 +1203,7 @@ decltype((_STD::declval<_Tp>() = _STD::declval<_Arg>(), true_type())) #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES __is_assignable_test(_Tp&&, _Arg&&); #else -__is_assignable_test(_Tp&, _Arg&); +__is_assignable_test(_Tp, _Arg&); #endif template @@ -1211,13 +1214,19 @@ __is_assignable_test(__any, _Arg&&); __is_assignable_test(__any, _Arg&); #endif -template +template ::value || is_void<_Arg>::value> struct __is_assignable_imp : public common_type < decltype(__is_assignable_test(declval<_Tp>(), declval<_Arg>())) >::type {}; +template +struct __is_assignable_imp<_Tp, _Arg, true> + : public false_type +{ +}; + template struct is_assignable : public __is_assignable_imp<_Tp, _Arg> {}; @@ -1225,13 +1234,15 @@ struct is_assignable // is_copy_assignable template struct _LIBCPP_VISIBLE is_copy_assignable - : public is_assignable<_Tp&, const _Tp&> {}; + : public is_assignable::type, + const typename add_lvalue_reference<_Tp>::type> {}; // is_move_assignable template struct _LIBCPP_VISIBLE is_move_assignable #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - : public is_assignable<_Tp&, _Tp&&> {}; + : public is_assignable::type, + const typename add_rvalue_reference<_Tp>::type> {}; #else : public is_copy_assignable<_Tp> {}; #endif @@ -2143,6 +2154,12 @@ struct _LIBCPP_VISIBLE is_nothrow_constructible { }; +template +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp[_Ns]> + : __is_nothrow_constructible::value, _Tp> +{ +}; + #else // __has_feature(cxx_noexcept) template @@ -2384,6 +2401,28 @@ struct _LIBCPP_VISIBLE is_nothrow_destructible { }; +template +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp[_Ns]> + : public is_nothrow_destructible<_Tp> +{ +}; + +template +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&> + : public true_type +{ +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&&> + : public true_type +{ +}; + +#endif + #else template struct __libcpp_nothrow_destructor @@ -2423,6 +2462,37 @@ template struct _LIBCPP_VISIBLE is_literal_type #endif {}; +// is_standard_layout; + +template struct _LIBCPP_VISIBLE is_standard_layout +#if __has_feature(is_standard_layout) + : public integral_constant +#else + : integral_constant::type>::value> +#endif + {}; + +// is_trivially_copyable; + +template struct _LIBCPP_VISIBLE is_trivially_copyable +#if __has_feature(is_trivially_copyable) + : public integral_constant +#else + : integral_constant::type>::value> +#endif + {}; + +// is_trivial; + +template struct _LIBCPP_VISIBLE is_trivial +#if __has_feature(is_trivial) + : public integral_constant +#else + : integral_constant::value && + is_trivially_default_constructible::value>::value> +#endif + {}; + template inline _LIBCPP_INLINE_VISIBILITY void diff --git a/test/utilities/meta/meta.hel/integral_constant.pass.cpp b/test/utilities/meta/meta.hel/integral_constant.pass.cpp index f7a35205..7f9e2769 100644 --- a/test/utilities/meta/meta.hel/integral_constant.pass.cpp +++ b/test/utilities/meta/meta.hel/integral_constant.pass.cpp @@ -20,7 +20,11 @@ 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), ""); +#ifndef _LIBCPP_HAS_NO_CONSTEXPR static_assert((_5() == 5), ""); +#else + assert(_5() == 5); +#endif static_assert(std::false_type::value == false, ""); static_assert((std::is_same::value), ""); diff --git a/test/utilities/meta/meta.trans/meta.trans.other/aligned_union.pass.cpp b/test/utilities/meta/meta.trans/meta.trans.other/aligned_union.pass.cpp deleted file mode 100644 index 67ab944b..00000000 --- a/test/utilities/meta/meta.trans/meta.trans.other/aligned_union.pass.cpp +++ /dev/null @@ -1,19 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// type_traits - -// aligned_union - -#include - -int main() -{ -#error aligned_union is not implemented -} diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp index d836e6ac..e37987c5 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp @@ -31,4 +31,8 @@ int main() static_assert(( std::is_assignable::value), ""); static_assert(( std::is_assignable::value), ""); static_assert((!std::is_assignable::value), ""); + static_assert((!std::is_assignable::value), ""); + static_assert((!std::is_assignable::value), ""); + static_assert(( std::is_assignable::value), ""); + static_assert((!std::is_assignable::value), ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_constructible.pass.cpp index 40b15c4e..6f58adc5 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_constructible.pass.cpp @@ -18,6 +18,8 @@ struct A { explicit A(int); A(int, double); +private: + A(char); }; int main() @@ -27,4 +29,9 @@ int main() static_assert((std::is_constructible::value), ""); static_assert((std::is_constructible::value), ""); static_assert((!std::is_constructible::value), ""); + static_assert((!std::is_constructible::value), ""); + static_assert((!std::is_constructible::value), ""); + static_assert((!std::is_constructible::value), ""); + static_assert((!std::is_constructible::value), ""); + static_assert(( std::is_constructible::value), ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp index c44ba6d0..9f9acd19 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp @@ -35,6 +35,11 @@ struct A A(); }; +class B +{ + B& operator=(const B&); +}; + int main() { static_assert(( std::is_copy_assignable::value), ""); @@ -47,4 +52,6 @@ int main() static_assert(( std::is_copy_assignable::value), ""); static_assert(( std::is_copy_assignable::value), ""); static_assert(( std::is_copy_assignable::value), ""); + static_assert((!std::is_copy_assignable::value), ""); + static_assert((!std::is_copy_assignable::value), ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp index 691ac693..1cfb76fa 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp @@ -47,6 +47,11 @@ struct A A(const A&); }; +class B +{ + B(const B&); +}; + int main() { test_is_copy_constructible(); @@ -55,6 +60,7 @@ int main() test_is_copy_constructible(); test_is_copy_constructible(); + test_is_copy_constructible(); test_is_copy_constructible(); test_is_copy_constructible(); test_is_copy_constructible(); diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_default_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_default_constructible.pass.cpp index 0830ce16..760a79b0 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_default_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_default_constructible.pass.cpp @@ -50,6 +50,11 @@ struct A A(); }; +class B +{ + B(); +}; + int main() { test_is_default_constructible(); @@ -58,6 +63,7 @@ int main() test_is_default_constructible(); test_is_default_constructible(); + test_is_default_constructible(); test_is_default_constructible(); test_is_default_constructible(); test_is_default_constructible(); diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_literal_type.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_literal_type.pass.cpp index b3640f70..30e31ba5 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_literal_type.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_literal_type.pass.cpp @@ -13,10 +13,21 @@ #include +struct A +{ +}; + +struct B +{ + B(); +}; + int main() { static_assert( std::is_literal_type::value, ""); static_assert( std::is_literal_type::value, ""); - static_assert(!std::is_literal_type::value, ""); - static_assert(!std::is_literal_type::value, ""); + static_assert( std::is_literal_type::value, ""); + static_assert( std::is_literal_type::value, ""); + static_assert( std::is_literal_type::value, ""); + static_assert(!std::is_literal_type::value, ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp index 3f44f8eb..8941fe3e 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp @@ -41,7 +41,8 @@ int main() static_assert((!std::is_move_assignable::value), ""); static_assert((!std::is_move_assignable::value), ""); static_assert((!std::is_move_assignable::value), ""); - static_assert(( std::is_move_assignable::value), ""); + static_assert((!std::is_move_assignable::value), ""); + static_assert((!std::is_move_assignable::value), ""); static_assert(( std::is_move_assignable::value), ""); static_assert(( std::is_move_assignable::value), ""); static_assert(( std::is_move_assignable::value), ""); diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp index 3dc73cef..5da776fa 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp @@ -47,4 +47,6 @@ int main() static_assert((!std::is_nothrow_constructible::value), ""); static_assert((!std::is_nothrow_constructible::value), ""); static_assert((!std::is_nothrow_constructible::value), ""); + static_assert(( std::is_nothrow_constructible::value), ""); + static_assert(( std::is_nothrow_constructible::value), ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_assignable.pass.cpp index b0fe0638..1436dd44 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_assignable.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_assignable.pass.cpp @@ -42,6 +42,7 @@ struct A int main() { + test_has_nothrow_assign(); test_has_nothrow_assign(); test_has_nothrow_assign(); test_has_nothrow_assign(); diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible.pass.cpp index 6bb51044..99fce65d 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible.pass.cpp @@ -18,8 +18,6 @@ void test_is_nothrow_copy_constructible() { static_assert( std::is_nothrow_copy_constructible::value, ""); static_assert( std::is_nothrow_copy_constructible::value, ""); - static_assert( std::is_nothrow_copy_constructible::value, ""); - static_assert( std::is_nothrow_copy_constructible::value, ""); } template @@ -35,12 +33,6 @@ class Empty { }; -class NotEmpty -{ -public: - virtual ~NotEmpty(); -}; - union Union {}; struct bit_zero @@ -65,6 +57,5 @@ int main() test_is_nothrow_copy_constructible(); test_is_nothrow_copy_constructible(); test_is_nothrow_copy_constructible(); - test_is_nothrow_copy_constructible(); test_is_nothrow_copy_constructible(); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_default_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_default_constructible.pass.cpp index 84fb5f41..1550dff0 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_default_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_default_constructible.pass.cpp @@ -35,12 +35,6 @@ class Empty { }; -class NotEmpty -{ -public: - virtual ~NotEmpty(); -}; - union Union {}; struct bit_zero @@ -66,6 +60,5 @@ int main() test_is_nothrow_default_constructible(); test_is_nothrow_default_constructible(); test_is_nothrow_default_constructible(); - test_is_nothrow_default_constructible(); test_is_nothrow_default_constructible(); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible.pass.cpp index fc520760..f5a42afe 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible.pass.cpp @@ -18,8 +18,6 @@ void test_is_nothrow_move_constructible() { static_assert( std::is_nothrow_move_constructible::value, ""); static_assert( std::is_nothrow_move_constructible::value, ""); - static_assert( std::is_nothrow_move_constructible::value, ""); - static_assert( std::is_nothrow_move_constructible::value, ""); } template @@ -35,12 +33,6 @@ class Empty { }; -class NotEmpty -{ -public: - virtual ~NotEmpty(); -}; - union Union {}; struct bit_zero @@ -58,13 +50,12 @@ int main() test_has_not_nothrow_move_constructor(); test_has_not_nothrow_move_constructor(); - test_has_not_nothrow_move_constructor(); + test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); - test_is_nothrow_move_constructible(); test_is_nothrow_move_constructible(); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_standard_layout.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_standard_layout.pass.cpp index 5c16d4f9..70500f34 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_standard_layout.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_standard_layout.pass.cpp @@ -13,9 +13,18 @@ #include +template +struct pair +{ + T1 first; + T2 second; +}; + int main() { static_assert( std::is_standard_layout::value, ""); + static_assert( std::is_standard_layout::value, ""); static_assert(!std::is_standard_layout::value, ""); static_assert(!std::is_standard_layout::value, ""); + static_assert(( std::is_standard_layout >::value), ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivial.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivial.pass.cpp index 387789da..bf833c0a 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivial.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivial.pass.cpp @@ -13,9 +13,19 @@ #include +struct A {}; + +class B +{ +public: + B(); +}; + int main() { static_assert( std::is_trivial::value, ""); static_assert(!std::is_trivial::value, ""); static_assert(!std::is_trivial::value, ""); + static_assert( std::is_trivial::value, ""); + static_assert(!std::is_trivial::value, ""); } diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable.pass.cpp index f064d6de..14f19ab3 100644 --- a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable.pass.cpp @@ -25,6 +25,12 @@ struct B ~B() {assert(i_ == 0);} }; +class C +{ +public: + C(); +}; + int main() { static_assert( std::is_trivially_copyable::value, ""); @@ -34,4 +40,5 @@ int main() static_assert( std::is_trivially_copyable::value, ""); static_assert(!std::is_trivially_copyable::value, ""); static_assert(!std::is_trivially_copyable::value, ""); + static_assert( std::is_trivially_copyable::value, ""); }