From fb682f9458c6cf421e11380f5d8b97393feb0bc0 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Sat, 28 Jun 2014 08:45:27 +0100 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/typeck.c | 4 +--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/elision_conv.C | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/elision_conv.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2236a5c948a..c7a0ccbfedb 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 65dccf7a1b3..042e600e33f 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 c7d90e6cadb..df79f3bc88b 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 00000000000..d778a0b8025 --- /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; +} -- 2.30.2