aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-09-08 17:36:08 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-09-08 17:36:08 +0000
commite5ba9b702f14441f43a577e9f44192c14a43cd7b (patch)
tree45b847e27dbdc2175a5265187b18b8d173e28302 /gcc
parent3075affdbcb3232fe549fbeed87bd94114c14758 (diff)
downloadgcc-e5ba9b702f14441f43a577e9f44192c14a43cd7b.zip
gcc-e5ba9b702f14441f43a577e9f44192c14a43cd7b.tar.gz
gcc-e5ba9b702f14441f43a577e9f44192c14a43cd7b.tar.bz2
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. * g++.dg/cpp0x/move-return2.C: New test. From-SVN: r264172
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/call.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/move-return2.C11
4 files changed, 29 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c0fa466..76fe61e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 942b2c2..03b4c5a 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 15e3979..0c03844 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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.
* g++.dg/cpp0x/lambda/lambda-const-this.C: Add dg-warning.
* g++.dg/cpp0x/lambda/lambda-in-class-neg.C: Likewise.
diff --git a/gcc/testsuite/g++.dg/cpp0x/move-return2.C b/gcc/testsuite/g++.dg/cpp0x/move-return2.C
new file mode 100644
index 0000000..681e9ec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/move-return2.C
@@ -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" }
+}