From: Jonathan Wakely Date: Sat, 28 Jun 2014 07:45:27 +0000 (+0100) Subject: DR 1579 PR c++/58051 X-Git-Tag: releases/gcc-5.1.0~6607 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=r5-1576-gfb682f9458c6cf;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2236a5c948a4..c7a0ccbfedb5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-06-28 Jonathan Wakely + + 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 PR c++/61433 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 65dccf7a1b35..042e600e33f3 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 c7d90e6cadb7..df79f3bc88b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-06-28 Jonathan Wakely + + * g++.dg/cpp0x/elision_conv.C: New. + 2014-06-27 Bill Schmidt * 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 000000000000..d778a0b8025a --- /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; +}