diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2014-06-28 08:45:27 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2014-06-28 08:45:27 +0100 |
commit | fb682f9458c6cf421e11380f5d8b97393feb0bc0 (patch) | |
tree | 593275776306dbd6a9d45a4e0b3bc6778b11fe9a /gcc | |
parent | c02e1851747b407efc2600cb2a2b35bf5d68efcd (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/elision_conv.C | 18 |
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; +} |