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:
Marek Polacek 2019-06-12 22:41:35 +00:00 committed by Marek Polacek
parent 0d0137a37f
commit 22f6d17441
4 changed files with 31 additions and 2 deletions

View File

@ -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

View File

@ -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))

View File

@ -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.

View 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" }
}
};