class.c (add_implicitly_declared_members): Update move conditions.
authorJason Merrill <jason@redhat.com>
Thu, 17 Nov 2011 16:35:11 +0000 (11:35 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 17 Nov 2011 16:35:11 +0000 (11:35 -0500)
N3203
* class.c (add_implicitly_declared_members): Update move
conditions.

From-SVN: r181445

gcc/cp/ChangeLog
gcc/cp/class.c
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/21_strings/basic_string/cons/char/moveable2.cc
libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/moveable2.cc
libstdc++-v3/testsuite/util/testsuite_tr1.h

index 3807f9a907a4d1c0f329da64bafa272b62dc5240..89f845edc9f153116aced82c203ac26b0a42e4fe 100644 (file)
@@ -1,5 +1,9 @@
 2011-11-17  Jason Merrill  <jason@redhat.com>
 
+       N3203
+       * class.c (add_implicitly_declared_members): Update move
+       conditions.
+
        PR c++/51137
        * class.c (build_base_path): Don't do calculation in templates.
 
index 0765817aed3fd35ea3d7c61f709477070ac4ec6a..cb0e683c59763823b8e6c0f874b3c720eff1b33e 100644 (file)
@@ -2721,6 +2721,13 @@ add_implicitly_declared_members (tree t,
                                 int cant_have_const_cctor,
                                 int cant_have_const_assignment)
 {
+  bool move_ok = false;
+
+  if (cxx_dialect >= cxx0x && !CLASSTYPE_DESTRUCTORS (t)
+      && !TYPE_HAS_COPY_CTOR (t) && !TYPE_HAS_COPY_ASSIGN (t)
+      && !type_has_move_constructor (t) && !type_has_move_assign (t))
+    move_ok = true;
+
   /* Destructor.  */
   if (!CLASSTYPE_DESTRUCTORS (t))
     {
@@ -2758,7 +2765,7 @@ add_implicitly_declared_members (tree t,
       TYPE_HAS_COPY_CTOR (t) = 1;
       TYPE_HAS_CONST_COPY_CTOR (t) = !cant_have_const_cctor;
       CLASSTYPE_LAZY_COPY_CTOR (t) = 1;
-      if (cxx_dialect >= cxx0x && !type_has_move_constructor (t))
+      if (move_ok)
        CLASSTYPE_LAZY_MOVE_CTOR (t) = 1;
     }
 
@@ -2771,7 +2778,7 @@ add_implicitly_declared_members (tree t,
       TYPE_HAS_COPY_ASSIGN (t) = 1;
       TYPE_HAS_CONST_COPY_ASSIGN (t) = !cant_have_const_assignment;
       CLASSTYPE_LAZY_COPY_ASSIGN (t) = 1;
-      if (cxx_dialect >= cxx0x && !type_has_move_assign (t))
+      if (move_ok)
        CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 1;
     }
 
index 58eb49898b965ef6bbe6a7a6cca873762613087d..b1f1814e83f7d9f71263ed0a53b4c2473965a929 100644 (file)
@@ -1,3 +1,13 @@
+2011-11-17  Jason Merrill  <jason@redhat.com>
+
+       * testsuite/21_strings/basic_string/cons/char/moveable2.cc
+       (tstring): Add defaulted move assignment.
+       * testsuite/21_strings/basic_string/cons/wchar_t/moveable2.cc
+       (tstring): Add defaulted move assignment.
+       * testsuite/util/testsuite_tr1.h (NoexceptMoveConsClass): Add
+       defaulted move assignment operator.
+       (NoexceptMoveAssignClass): Add defaulted move constructor.
+
 2011-11-17  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
        * doc/xml/manual/status_cxx2011.xml: Status of piecewise construction
index 13cc4e5d19654f54c6c882cc4cd14ce650eb564b..2d1b4ca86a02949e1809a14dd87644f29ac30c9f 100644 (file)
@@ -31,6 +31,7 @@ class tstring : public std::basic_string<char>
 public:
   tstring() : std::basic_string<char>() {}
   tstring(tstring&& s) : std::basic_string<char>(std::move(s)) {}
+  tstring& operator=(tstring&& s) = default;
 };
 
 void test01()
index e0b8b24a0cb87ca9e381cab2550fc3b3b75c24fa..42026c90bd81265094301154d3bfc19bb1f54327 100644 (file)
@@ -31,6 +31,7 @@ class twstring : public std::basic_string<wchar_t>
 public:
   twstring() : std::basic_string<wchar_t>() {}
   twstring(twstring&& s) : std::basic_string<wchar_t>(std::move(s)) {}
+  twstring& operator=(twstring&&) = default;
 };
 
 void test01()
index f0638960b27164d17e46f2f85707d58eac7b9278..1452e3e9f8824a1666dad00d51673e482fb6781e 100644 (file)
@@ -199,6 +199,7 @@ namespace __gnu_test
   struct NoexceptMoveConsClass
   {
     NoexceptMoveConsClass(NoexceptMoveConsClass&&) noexcept(true);
+    NoexceptMoveConsClass& operator=(NoexceptMoveConsClass&&) = default;
   };
 
   struct ExceptMoveConsClass
@@ -220,6 +221,7 @@ namespace __gnu_test
 
   struct NoexceptMoveAssignClass
   {
+    NoexceptMoveAssignClass(NoexceptMoveAssignClass&&) = default;
     NoexceptMoveAssignClass&
     operator=(NoexceptMoveAssignClass&&) noexcept(true);
   };