diff --git a/libcxx/include/tuple b/libcxx/include/tuple --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -844,13 +844,13 @@ template &>::value>* = nullptr> _LIBCPP_HIDE_FROM_ABI constexpr - explicit(!(is_convertible_v<_Up&, _Tp> && ...)) + explicit(!_Lazy<_And, is_convertible<_Up&, _Tp>...>::value) tuple(tuple<_Up...>& __t) : __base_(__t) {} template &>::value>* = nullptr> _LIBCPP_HIDE_FROM_ABI constexpr - explicit(!(is_convertible_v<_Up&, _Tp> && ...)) + explicit(!_Lazy<_And, is_convertible<_Up&, _Tp>...>::value) tuple(allocator_arg_t, const _Alloc& __alloc, tuple<_Up...>& __t) : __base_(allocator_arg_t(), __alloc, __t) {} #endif // _LIBCPP_STD_VER > 20 @@ -908,13 +908,13 @@ template &&>::value>* = nullptr> _LIBCPP_HIDE_FROM_ABI constexpr - explicit(!(is_convertible_v && ...)) + explicit(!_Lazy<_And, is_convertible...>::value) tuple(const tuple<_Up...>&& __t) : __base_(std::move(__t)) {} template &&>::value>* = nullptr> _LIBCPP_HIDE_FROM_ABI constexpr - explicit(!(is_convertible_v && ...)) + explicit(!_Lazy<_And, is_convertible...>::value) tuple(allocator_arg_t, const _Alloc& __alloc, const tuple<_Up...>&& __t) : __base_(allocator_arg_t(), __alloc, std::move(__t)) {} #endif // _LIBCPP_STD_VER > 20 diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/recursion_depth.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/recursion_depth.pass.cpp --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/recursion_depth.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/recursion_depth.pass.cpp @@ -17,9 +17,17 @@ template constexpr void CreateTuple(std::index_sequence) { - std::tuple tuple(I...); + using LargeTuple = std::tuple; + LargeTuple tuple(I...); assert(std::get<0>(tuple) == 0); assert(std::get(tuple) == sizeof...(I)-1); + LargeTuple t2 = tuple; // copy constructor + LargeTuple t3 = std::move(tuple); // move constructor + LargeTuple t4; // default constructor + t3 = t2; // copy assignment + t4 = std::move(t2); // move assignment + swap(t3, t4); // swap + // equality (t3 == t4) does not work } constexpr bool test() {