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
/* 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;
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))
-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.
--- /dev/null
+// 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" }
+ }
+};