diff --git a/libcxx/docs/Cxx1zStatusIssuesStatus.csv b/libcxx/docs/Cxx1zStatusIssuesStatus.csv --- a/libcxx/docs/Cxx1zStatusIssuesStatus.csv +++ b/libcxx/docs/Cxx1zStatusIssuesStatus.csv @@ -232,7 +232,7 @@ "`2699 `__","Missing restriction in [numeric.requirements]","Issaquah","|Complete|","" "`2712 `__","copy_file(from, to, ...) has a number of unspecified error conditions","Issaquah","|Complete|","" "`2722 `__","equivalent incorrectly specifies throws clause","Issaquah","|Complete|","" -"`2729 `__","Missing SFINAE on std::pair::operator=","Issaquah","","" +"`2729 `__","Missing SFINAE on std::pair::operator=","Issaquah","|Complete|","" "`2732 `__","Questionable specification of path::operator/= and path::append","Issaquah","|Complete|","" "`2733 `__","[fund.ts.v2] gcd / lcm and bool","Issaquah","|Complete|","" "`2735 `__","std::abs(short), std::abs(signed char) and others should return int instead of double in order to be compatible with C++98 and C","Issaquah","|Complete|","" diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp @@ -35,6 +35,10 @@ MoveAssignable& operator=(MoveAssignable&&) = default; }; +struct CopyAssignableInt { + CopyAssignableInt& operator=(int&) { return *this; } +}; + int main(int, char**) { { @@ -100,6 +104,21 @@ using T = std::tuple; static_assert(!std::is_copy_assignable::value, ""); } + { + using T = std::tuple; + using P = std::pair ; + static_assert(!std::is_assignable::value, ""); + } + { // test const requirement + using T = std::tuple; + using P = std::pair ; + static_assert(!std::is_assignable::value, ""); + } + { + using T = std::tuple; + using P = std::pair ; + static_assert(!std::is_assignable::value, ""); + } return 0; } diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp @@ -37,6 +37,12 @@ explicit D(int i) : B(i) {} }; +struct NonMoveAssignable +{ + NonMoveAssignable& operator=(NonMoveAssignable const&) = default; + NonMoveAssignable& operator=(NonMoveAssignable &&) = delete; +}; + int main(int, char**) { { @@ -48,6 +54,16 @@ assert(std::get<0>(t1) == 2); assert(std::get<1>(t1)->id_ == 3); } + { + using T = std::tuple; + using P = std::pair ; + static_assert(!std::is_assignable::value, ""); + } + { + using T = std::tuple; + using P = std::pair ; + static_assert(!std::is_assignable::value, ""); + } return 0; }