diff --git a/libcxx/include/tuple b/libcxx/include/tuple --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -1116,13 +1116,12 @@ tuple(allocator_arg_t, _Alloc, tuple<_Tp...>) -> tuple<_Tp...>; #endif +template +struct __all_are_swappable : __all<__is_swappable<_Ts>::value...> {}; + template inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -typename enable_if -< - __all<__is_swappable<_Tp>::value...>::value, - void ->::type +typename enable_if<__all_are_swappable<_Tp...>::value>::type swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) {__t.swap(__u);} diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -550,8 +550,6 @@ // is_same -#if __has_keyword(__is_same) - template struct _LIBCPP_TEMPLATE_VIS is_same : _BoolConstant<__is_same(_Tp, _Up)> { }; @@ -560,36 +558,17 @@ inline constexpr bool is_same_v = __is_same(_Tp, _Up); #endif -#else - -template struct _LIBCPP_TEMPLATE_VIS is_same : public false_type {}; -template struct _LIBCPP_TEMPLATE_VIS is_same<_Tp, _Tp> : public true_type {}; - -#if _LIBCPP_STD_VER > 14 -template -inline constexpr bool is_same_v = is_same<_Tp, _Up>::value; -#endif - -#endif // __is_same +// _IsSame has the same effect as is_same but instantiates fewer types: +// is_same and is_same are guaranteed to be different types, but +// _IsSame and _IsSame are the same type (namely, false_type). +// If we ever need to support a compiler without the __is_same builtin, +// we can make this an alias template for `is_same::type`. template -using _IsSame = _BoolConstant< -#ifdef __clang__ - __is_same(_Tp, _Up) -#else - is_same<_Tp, _Up>::value -#endif ->; +using _IsSame = _BoolConstant<__is_same(_Tp, _Up)>; template -using _IsNotSame = _BoolConstant< -#ifdef __clang__ - !__is_same(_Tp, _Up) -#else - !is_same<_Tp, _Up>::value -#endif ->; - +using _IsNotSame = _BoolConstant; template using __test_for_primary_template = __enable_if_t< @@ -600,10 +579,6 @@ __test_for_primary_template, _Tp >; -struct __two {char __lx[2];}; - -// helper class: - // is_const #if __has_keyword(__is_const) @@ -958,6 +933,8 @@ // is_class +struct __two {char __lx[2];}; + #if __has_feature(is_class) || defined(_LIBCPP_COMPILER_GCC) template struct _LIBCPP_TEMPLATE_VIS is_class