From: Jason Merrill Date: Tue, 9 Jul 2013 17:56:32 +0000 (-0400) Subject: re PR c++/57437 (C++11: mutable lambdas) X-Git-Tag: releases/gcc-4.9.0~5059 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f9f91ddcf76a01b80f8b194f7402aedc40e8af79;p=thirdparty%2Fgcc.git re PR c++/57437 (C++11: mutable lambdas) PR c++/57437 * typeck.c (check_return_expr): Lambda proxies aren't eligible for nrv or return by move. From-SVN: r200843 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2d6fa73d0117..68c6a09cff93 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-07-09 Jason Merrill + PR c++/57437 + * typeck.c (check_return_expr): Lambda proxies aren't eligible + for nrv or return by move. + PR c++/57532 * parser.c (cp_parser_ref_qualifier_opt): Don't tentatively parse a ref-qualifier in C++98 mode. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 462abdd5039d..6f7d48928791 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8399,7 +8399,8 @@ check_return_expr (tree retval, bool *no_warning) && VAR_P (retval) && DECL_CONTEXT (retval) == current_function_decl && ! TREE_STATIC (retval) - && ! DECL_ANON_UNION_VAR_P (retval) + /* And not a lambda or anonymous union proxy. */ + && !DECL_HAS_VALUE_EXPR_P (retval) && (DECL_ALIGN (retval) <= DECL_ALIGN (result)) /* The cv-unqualified type of the returned value must be the same as the cv-unqualified return type of the @@ -8444,7 +8445,7 @@ check_return_expr (tree retval, bool *no_warning) Note that these conditions are similar to, but not as strict as, the conditions for the named return value optimization. */ if ((cxx_dialect != cxx98) - && (VAR_P (retval) + && ((VAR_P (retval) && !DECL_HAS_VALUE_EXPR_P (retval)) || TREE_CODE (retval) == PARM_DECL) && DECL_CONTEXT (retval) == current_function_decl && !TREE_STATIC (retval) diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C new file mode 100644 index 000000000000..4b353b64c37e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C @@ -0,0 +1,26 @@ +// PR c++/57437 +// { dg-require-effective-target c++11 } + +struct A { + int i; + + A(): i(42) {} + A(const A&) = default; + A(A&& a): i(a.i) { a.i = 0; } +}; + +int main() +{ + A x; + + auto y = [x] () mutable { + x.i++; + return x; + }; + + if (y().i != 43) + __builtin_abort (); + + if (y().i != 44) + __builtin_abort (); +}