Index: include/__config =================================================================== --- include/__config +++ include/__config @@ -485,6 +485,11 @@ typedef unsigned int char32_t; #endif // _LIBCPP_HAS_NO_UNICODE_CHARS +#ifdef __SIZEOF_INT128__ +#define _LIBCPP_INT128 __int128_t +#define _LIBCPP_UINT128 __uint128_t +#endif + #ifdef _LIBCPP_HAS_NO_STATIC_ASSERT template struct __static_assert_test; Index: include/type_traits =================================================================== --- include/type_traits +++ include/type_traits @@ -324,6 +324,10 @@ template <> struct __libcpp_is_integral : public true_type {}; template <> struct __libcpp_is_integral : public true_type {}; template <> struct __libcpp_is_integral : public true_type {}; +#ifdef _LIBCPP_INT128 +template <> struct __libcpp_is_integral<_LIBCPP_INT128> : public true_type {}; +template <> struct __libcpp_is_integral<_LIBCPP_UINT128> : public true_type {}; +#endif template struct _LIBCPP_TYPE_VIS_ONLY is_integral : public __libcpp_is_integral::type> {}; @@ -1239,7 +1243,11 @@ __type_list +#else __nat +#endif > > > > > __signed_types; typedef @@ -1248,7 +1256,11 @@ __type_list +#else __nat +#endif > > > > > __unsigned_types; template struct __find_first; @@ -1332,6 +1344,10 @@ template <> struct __make_signed {typedef long type;}; template <> struct __make_signed< signed long long, true> {typedef long long type;}; template <> struct __make_signed {typedef long long type;}; +#ifdef _LIBCPP_INT128 +template <> struct __make_signed<_LIBCPP_INT128, true> {typedef _LIBCPP_INT128 type;}; +template <> struct __make_signed<_LIBCPP_UINT128, true> {typedef _LIBCPP_INT128 type;}; +#endif template struct _LIBCPP_TYPE_VIS_ONLY make_signed @@ -1361,6 +1377,10 @@ template <> struct __make_unsigned {typedef unsigned long type;}; template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;}; template <> struct __make_unsigned {typedef unsigned long long type;}; +#ifdef _LIBCPP_INT128 +template <> struct __make_unsigned<_LIBCPP_INT128, true> {typedef _LIBCPP_UINT128 type;}; +template <> struct __make_unsigned<_LIBCPP_UINT128, true> {typedef _LIBCPP_UINT128 type;}; +#endif template struct _LIBCPP_TYPE_VIS_ONLY make_unsigned Index: test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp =================================================================== --- test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp +++ test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp @@ -21,6 +21,13 @@ big = 0xFFFFFFFFFFFFFFFFULL }; +#ifdef _LIBCPP_INT128 +enum HugeEnum : _LIBCPP_UINT128 +{ + hugezero +}; +#endif + template void test_make_signed() { @@ -47,4 +54,9 @@ test_make_signed< const wchar_t, std::conditional::type >(); test_make_signed< const Enum, const int >(); test_make_signed< BigEnum, std::conditional::type >(); +#ifdef _LIBCPP_INT128 + test_make_signed< _LIBCPP_INT128, _LIBCPP_INT128 >(); + test_make_signed< _LIBCPP_UINT128, _LIBCPP_INT128 >(); + test_make_signed< HugeEnum, _LIBCPP_INT128 >(); +#endif } Index: test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp =================================================================== --- test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp +++ test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp @@ -21,6 +21,13 @@ big = 0xFFFFFFFFFFFFFFFFULL }; +#ifdef _LIBCPP_INT128 +enum HugeEnum : _LIBCPP_INT128 +{ + hugezero +}; +#endif + template void test_make_unsigned() { @@ -48,4 +55,9 @@ test_make_unsigned (); test_make_unsigned::type> (); +#ifdef _LIBCPP_INT128 + test_make_unsigned<_LIBCPP_INT128, _LIBCPP_UINT128>(); + test_make_unsigned<_LIBCPP_UINT128, _LIBCPP_UINT128>(); + test_make_unsigned(); +#endif } Index: test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp =================================================================== --- test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp +++ test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp @@ -58,4 +58,8 @@ test_integral(); test_integral(); test_integral(); +#ifdef _LIBCPP_INT128 + test_integral<_LIBCPP_INT128>(); + test_integral<_LIBCPP_UINT128>(); +#endif } Index: test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp =================================================================== --- test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp +++ test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp @@ -49,4 +49,8 @@ test_integral(); test_integral(); test_integral(); +#ifdef _LIBCPP_INT128 + test_integral<_LIBCPP_INT128>(); + test_integral<_LIBCPP_UINT128>(); +#endif } Index: test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp =================================================================== --- test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp +++ test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp @@ -51,4 +51,9 @@ test_is_signed(); test_is_signed(); + +#ifdef _LIBCPP_INT128 + test_is_signed<_LIBCPP_INT128>(); + test_is_not_signed<_LIBCPP_UINT128>(); +#endif } Index: test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp =================================================================== --- test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp +++ test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp @@ -51,4 +51,9 @@ test_is_unsigned(); test_is_unsigned(); + +#ifdef _LIBCPP_INT128 + test_is_unsigned<_LIBCPP_UINT128>(); + test_is_not_unsigned<_LIBCPP_INT128>(); +#endif }