PR c++/55017
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 17 Mar 2013 02:35:01 +0000 (02:35 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 17 Mar 2013 02:35:01 +0000 (02:35 +0000)
* method.c (walk_field_subobs): Disallow copy of rvalue ref.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196728 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/testsuite/g++.dg/cpp0x/rv-copy1.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/20_util/pair/piecewise2.cc

index 04eab4a..28b110c 100644 (file)
@@ -1,5 +1,8 @@
 2013-03-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/55017
+       * method.c (walk_field_subobs): Disallow copy of rvalue ref.
+
        PR c++/55240
        * parser.c (parsing_nsdmi): New.
        * semantics.c (outer_automatic_var_p): Check it.
index ff29b59..55c7e50 100644 (file)
@@ -1115,6 +1115,19 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
                        "initialize %q+#D", field);
            }
        }
+      else if (sfk == sfk_copy_constructor)
+       {
+         /* 12.8p11b5 */
+         if (TREE_CODE (mem_type) == REFERENCE_TYPE
+             && TYPE_REF_IS_RVALUE (mem_type))
+           {
+             if (diag)
+               error ("copying non-static data member %q#D of rvalue "
+                      "reference type", field);
+             if (deleted_p)
+               *deleted_p = true;
+           }
+       }
 
       if (!CLASS_TYPE_P (mem_type))
        continue;
diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C b/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C
new file mode 100644 (file)
index 0000000..70d3d71
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/55017
+// { dg-do compile { target c++11 } }
+
+struct S {                     // { dg-error "rvalue ref" }
+  int&& rr;
+  S(int&& rr) : rr(static_cast<int&&>(rr)) {}
+};
+
+S s1(13);
+S s2 = s1;                     // { dg-error "deleted" }
index efca94e..6de5bbb 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/55017
+       * testsuite/20_util/pair/piecewise2.cc (test01): Use std::move.
+
 2013-03-16  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
        PR libstdc++/56468
index d53e49c..0273c14 100644 (file)
@@ -51,7 +51,8 @@ struct Default
 void test01(std::tuple<NoCon&, NoCon&&> t1,
             std::tuple<NoCon&, NoCon&&, NoCon&> t2)
 {
-  std::pair<RefCheck1, RefCheck2>(std::piecewise_construct, t1, t2);
+  std::pair<RefCheck1, RefCheck2>(std::piecewise_construct,
+                                 std::move(t1), std::move(t2));
 }
 
 void test02(std::tuple<> t1, std::tuple<int> t2)