PR c++/66999 - 'this' captured by reference.
* parser.c (cp_parser_lambda_introducer): Reject `&this'. Use cp_lexer_nth_token_is instead of cp_lexer_peek_nth_token. * g++.dg/cpp0x/lambda/lambda-this21.C: New test. From-SVN: r272223
This commit is contained in:
parent
0d0137a37f
commit
22f6d17441
@ -1,5 +1,9 @@
|
||||
2019-06-12 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/66999 - 'this' captured by reference.
|
||||
* parser.c (cp_parser_lambda_introducer): Reject `&this'. Use
|
||||
cp_lexer_nth_token_is instead of cp_lexer_peek_nth_token.
|
||||
|
||||
PR c++/90825 - endless recursion when evaluating sizeof.
|
||||
PR c++/90832 - endless recursion when evaluating sizeof.
|
||||
* constexpr.c (cxx_eval_constant_expression): Don't recurse on the
|
||||
|
@ -10526,7 +10526,8 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
|
||||
|
||||
/* Record default capture mode. "[&" "[=" "[&," "[=," */
|
||||
if (cp_lexer_next_token_is (parser->lexer, CPP_AND)
|
||||
&& cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_NAME)
|
||||
&& !cp_lexer_nth_token_is (parser->lexer, 2, CPP_NAME)
|
||||
&& !cp_lexer_nth_token_is_keyword (parser->lexer, 2, RID_THIS))
|
||||
LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_REFERENCE;
|
||||
else if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
|
||||
LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_COPY;
|
||||
@ -10609,6 +10610,17 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* But reject `&this'. */
|
||||
if (cp_lexer_next_token_is (parser->lexer, CPP_AND)
|
||||
&& cp_lexer_nth_token_is_keyword (parser->lexer, 2, RID_THIS))
|
||||
{
|
||||
error_at (cp_lexer_peek_token (parser->lexer)->location,
|
||||
"%<this%> cannot be captured by reference");
|
||||
cp_lexer_consume_token (parser->lexer);
|
||||
cp_lexer_consume_token (parser->lexer);
|
||||
continue;
|
||||
}
|
||||
|
||||
bool init_pack_expansion = false;
|
||||
location_t ellipsis_loc = UNKNOWN_LOCATION;
|
||||
if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
|
||||
|
@ -1,4 +1,7 @@
|
||||
2019-06-11 Marek Polacek <polacek@redhat.com>
|
||||
2019-06-12 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/66999 - 'this' captured by reference.
|
||||
* g++.dg/cpp0x/lambda/lambda-this21.C: New test.
|
||||
|
||||
PR c++/90825 - endless recursion when evaluating sizeof.
|
||||
PR c++/90832 - endless recursion when evaluating sizeof.
|
||||
|
10
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this21.C
Normal file
10
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this21.C
Normal file
@ -0,0 +1,10 @@
|
||||
// PR c++/66999 - 'this' captured by reference.
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
struct X {
|
||||
void bar (int n)
|
||||
{
|
||||
auto l1 = [&this] { }; // { dg-error ".this. cannot be captured by reference" }
|
||||
auto l2 = [=, &this] { }; // { dg-error ".this. cannot be captured by reference" }
|
||||
}
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user