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
This commit is contained in:
parent
9a3970ddfc
commit
f9f91ddcf7
3 changed files with 33 additions and 2 deletions
|
@ -1,5 +1,9 @@
|
|||
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
|
||||
* parser.c (cp_parser_ref_qualifier_opt): Don't tentatively parse
|
||||
a ref-qualifier in C++98 mode.
|
||||
|
|
|
@ -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)
|
||||
|
|
26
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C
Normal file
26
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C
Normal file
|
@ -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 ();
|
||||
}
|
Loading…
Add table
Reference in a new issue