aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2014-06-28 08:45:27 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2014-06-28 08:45:27 +0100
commitfb682f9458c6cf421e11380f5d8b97393feb0bc0 (patch)
tree593275776306dbd6a9d45a4e0b3bc6778b11fe9a /gcc
parentc02e1851747b407efc2600cb2a2b35bf5d68efcd (diff)
downloadgcc-fb682f9458c6cf421e11380f5d8b97393feb0bc0.zip
gcc-fb682f9458c6cf421e11380f5d8b97393feb0bc0.tar.gz
gcc-fb682f9458c6cf421e11380f5d8b97393feb0bc0.tar.bz2
DR 1579 PR c++/58051
gcc/cp: DR 1579 PR c++/58051 * typeck.c (check_return_expr): Lookup as an rvalue even when the types aren't the same. gcc/testsuite: * g++.dg/cpp0x/elision_conv.C: New. From-SVN: r212099
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/typeck.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/elision_conv.C18
4 files changed, 30 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2236a5c..c7a0ccbf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2014-06-28 Jonathan Wakely <jwakely@redhat.com>
+
+ DR 1579
+ PR c++/58051
+ * typeck.c (check_return_expr): Lookup as an rvalue even when the
+ types aren't the same.
+
2014-06-27 Jason Merrill <jason@redhat.com>
PR c++/61433
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 65dccf7..042e600 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -8607,7 +8607,7 @@ check_return_expr (tree retval, bool *no_warning)
if (VOID_TYPE_P (functype))
return error_mark_node;
- /* Under C++0x [12.8/16 class.copy], a returned lvalue is sometimes
+ /* Under C++11 [12.8/32 class.copy], a returned lvalue is sometimes
treated as an rvalue for the purposes of overload resolution to
favor move constructors over copy constructors.
@@ -8618,8 +8618,6 @@ check_return_expr (tree retval, bool *no_warning)
|| TREE_CODE (retval) == PARM_DECL)
&& DECL_CONTEXT (retval) == current_function_decl
&& !TREE_STATIC (retval)
- && same_type_p ((TYPE_MAIN_VARIANT (TREE_TYPE (retval))),
- (TYPE_MAIN_VARIANT (functype)))
/* This is only interesting for class type. */
&& CLASS_TYPE_P (functype))
flags = flags | LOOKUP_PREFER_RVALUE;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c7d90e6..df79f3b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-06-28 Jonathan Wakely <jwakely@redhat.com>
+
+ * g++.dg/cpp0x/elision_conv.C: New.
+
2014-06-27 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gfortran.dg/nint_2.f90: Don't XFAIL for powerpc64le-*-linux*.
diff --git a/gcc/testsuite/g++.dg/cpp0x/elision_conv.C b/gcc/testsuite/g++.dg/cpp0x/elision_conv.C
new file mode 100644
index 0000000..d778a0b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/elision_conv.C
@@ -0,0 +1,18 @@
+// Core 1579 return by converting move constructor
+// PR c++/58051
+// { dg-do compile { target c++11 } }
+
+struct A {
+ A() = default;
+ A(A&&) = default;
+};
+
+struct B {
+ B(A) { }
+};
+
+B f()
+{
+ A a;
+ return a;
+}