Commit f9f91ddc by Jason Merrill Committed by Jason Merrill

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
parent 9a3970dd
2013-07-09 Jason Merrill <jason@redhat.com> 2013-07-09 Jason Merrill <jason@redhat.com>
PR c++/57437
* typeck.c (check_return_expr): Lambda proxies aren't eligible
for nrv or return by move.
PR c++/57532 PR c++/57532
* parser.c (cp_parser_ref_qualifier_opt): Don't tentatively parse * parser.c (cp_parser_ref_qualifier_opt): Don't tentatively parse
a ref-qualifier in C++98 mode. a ref-qualifier in C++98 mode.
......
...@@ -8399,7 +8399,8 @@ check_return_expr (tree retval, bool *no_warning) ...@@ -8399,7 +8399,8 @@ check_return_expr (tree retval, bool *no_warning)
&& VAR_P (retval) && VAR_P (retval)
&& DECL_CONTEXT (retval) == current_function_decl && DECL_CONTEXT (retval) == current_function_decl
&& ! TREE_STATIC (retval) && ! 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)) && (DECL_ALIGN (retval) <= DECL_ALIGN (result))
/* The cv-unqualified type of the returned value must be the /* The cv-unqualified type of the returned value must be the
same as the cv-unqualified return type of the same as the cv-unqualified return type of the
...@@ -8444,7 +8445,7 @@ check_return_expr (tree retval, bool *no_warning) ...@@ -8444,7 +8445,7 @@ check_return_expr (tree retval, bool *no_warning)
Note that these conditions are similar to, but not as strict as, Note that these conditions are similar to, but not as strict as,
the conditions for the named return value optimization. */ the conditions for the named return value optimization. */
if ((cxx_dialect != cxx98) if ((cxx_dialect != cxx98)
&& (VAR_P (retval) && ((VAR_P (retval) && !DECL_HAS_VALUE_EXPR_P (retval))
|| TREE_CODE (retval) == PARM_DECL) || TREE_CODE (retval) == PARM_DECL)
&& DECL_CONTEXT (retval) == current_function_decl && DECL_CONTEXT (retval) == current_function_decl
&& !TREE_STATIC (retval) && !TREE_STATIC (retval)
......
// 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 ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment