PR c++/87150 - wrong ctor with maybe-rvalue semantics.
authorMarek Polacek <polacek@redhat.com>
Sat, 8 Sep 2018 17:36:08 +0000 (17:36 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Sat, 8 Sep 2018 17:36:08 +0000 (17:36 +0000)
* call.c (struct conversion): Update commentary.
(standard_conversion): Set rvaluedness_matches_p if LOOKUP_PREFER_RVALUE
for ck_base.

* g++.dg/cpp0x/move-return2.C: New test.

From-SVN: r264172

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/move-return2.C [new file with mode: 0644]

index c0fa4660df9069cfb8c594c172e70346dd039edf..76fe61eff64f6c253aacd18c1aae22b08f752b34 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-08  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/87150 - wrong ctor with maybe-rvalue semantics.
+       * call.c (struct conversion): Update commentary.
+       (standard_conversion): Set rvaluedness_matches_p if LOOKUP_PREFER_RVALUE
+       for ck_base.
+
 2018-09-08  Jason Merrill  <jason@redhat.com>
 
        PR c++/86678 - constexpr function with non-constant after return.
index 942b2c204be32facab649dcc1a689b6c1e1223de..03b4c5ab224fc35c37e36a1706fb1e2f811396d5 100644 (file)
@@ -102,10 +102,10 @@ struct conversion {
   BOOL_BITFIELD base_p : 1;
   /* If KIND is ck_ref_bind, true when either an lvalue reference is
      being bound to an lvalue expression or an rvalue reference is
-     being bound to an rvalue expression.  If KIND is ck_rvalue,
+     being bound to an rvalue expression.  If KIND is ck_rvalue or ck_base,
      true when we are treating an lvalue as an rvalue (12.8p33).  If
-     KIND is ck_base, always false.  If ck_identity, we will be
-     binding a reference directly or decaying to a pointer.  */
+     ck_identity, we will be binding a reference directly or decaying to
+     a pointer.  */
   BOOL_BITFIELD rvaluedness_matches_p: 1;
   BOOL_BITFIELD check_narrowing: 1;
   /* Whether check_narrowing should only check TREE_CONSTANTs; used
@@ -1425,6 +1425,9 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
         type.  A temporary object is created to hold the result of
         the conversion unless we're binding directly to a reference.  */
       conv->need_temporary_p = !(flags & LOOKUP_NO_TEMP_BIND);
+      if (flags & LOOKUP_PREFER_RVALUE)
+       /* Tell convert_like_real to set LOOKUP_PREFER_RVALUE.  */
+       conv->rvaluedness_matches_p = true;
     }
   else
     return NULL;
index 15e3979fae1e3b4665d424380eb320d0154b78b9..0c038441a8c5089c38abbd7bc7670c9fa3c4a332 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-08  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/87150 - wrong ctor with maybe-rvalue semantics.
+       * g++.dg/cpp0x/move-return2.C: New test.
+
 2018-09-08  Marek Polacek  <polacek@redhat.com>
 
        * c-c++-common/array-init.c: Add dg-prune-output.
diff --git a/gcc/testsuite/g++.dg/cpp0x/move-return2.C b/gcc/testsuite/g++.dg/cpp0x/move-return2.C
new file mode 100644 (file)
index 0000000..681e9ec
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/87150
+// { dg-do compile { target c++11 } }
+
+struct S1 { S1(S1 &&); };
+struct S2 : S1 {};
+
+S1
+f (S2 s)
+{
+  return s; // { dg-error "use of deleted function" }
+}