[libcxx-commits] [PATCH] D62454: SFINAE on pair/tuple assignment operators 2729

Zoe Carver via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed Feb 17 11:07:59 PST 2021


zoecarver updated this revision to Diff 324361.
zoecarver added a comment.
Herald added a project: libc++.
Herald added a reviewer: libc++.

- Rebase off main
- Remove changes to unrelated tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62454/new/

https://reviews.llvm.org/D62454

Files:
  libcxx/docs/Cxx1zStatusIssuesStatus.csv
  libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp
  libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp


Index: libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp
===================================================================
--- libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/move_pair.pass.cpp
+++ 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<int, NonMoveAssignable>;
+        using P = std::pair <int, NonMoveAssignable>;
+        static_assert(!std::is_assignable<T&, P&&>::value, "");
+    }
+    {
+        using T = std::tuple<int, int, int>;
+        using P = std::pair <int, int>;
+        static_assert(!std::is_assignable<T&, P&&>::value, "");
+    }
 
   return 0;
 }
Index: libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp
===================================================================
--- libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/copy.pass.cpp
+++ 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<int, MoveAssignable>;
         static_assert(!std::is_copy_assignable<T>::value, "");
     }
+    {
+        using T = std::tuple<int, int, int>;
+        using P = std::pair <int, int>;
+        static_assert(!std::is_assignable<T, P>::value, "");
+    }
+    { // test const requirement
+        using T = std::tuple<CopyAssignableInt, CopyAssignableInt>;
+        using P = std::pair <int,               int>;
+        static_assert(!std::is_assignable<T&, P const>::value, "");
+    }
+    {
+        using T = std::tuple<int, MoveAssignable>;
+        using P = std::pair <int, MoveAssignable>;
+        static_assert(!std::is_assignable<T&, P&>::value, "");
+    }
 
   return 0;
 }
Index: libcxx/docs/Cxx1zStatusIssuesStatus.csv
===================================================================
--- libcxx/docs/Cxx1zStatusIssuesStatus.csv
+++ libcxx/docs/Cxx1zStatusIssuesStatus.csv
@@ -232,7 +232,7 @@
 "`2699 <https://wg21.link/LWG2699>`__","Missing restriction in [numeric.requirements]","Issaquah","|Complete|",""
 "`2712 <https://wg21.link/LWG2712>`__","copy_file(from, to, ...) has a number of unspecified error conditions","Issaquah","|Complete|",""
 "`2722 <https://wg21.link/LWG2722>`__","equivalent incorrectly specifies throws clause","Issaquah","|Complete|",""
-"`2729 <https://wg21.link/LWG2729>`__","Missing SFINAE on std::pair::operator=","Issaquah","",""
+"`2729 <https://wg21.link/LWG2729>`__","Missing SFINAE on std::pair::operator=","Issaquah","|Complete|",""
 "`2732 <https://wg21.link/LWG2732>`__","Questionable specification of path::operator/= and path::append","Issaquah","|Complete|",""
 "`2733 <https://wg21.link/LWG2733>`__","[fund.ts.v2] gcd / lcm and bool","Issaquah","|Complete|",""
 "`2735 <https://wg21.link/LWG2735>`__","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|",""


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62454.324361.patch
Type: text/x-patch
Size: 3527 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210217/6c9e383b/attachment-0001.bin>


More information about the libcxx-commits mailing list