From: Jason Merrill Date: Tue, 25 Mar 2014 18:00:37 +0000 (-0400) Subject: re PR c++/60375 ([c++11] ICE with invalid use of lambda) X-Git-Tag: releases/gcc-4.9.0~310 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1cbba79d074af647f641e9b684b8bba242421241;p=thirdparty%2Fgcc.git re PR c++/60375 ([c++11] ICE with invalid use of lambda) PR c++/60375 * parser.c (cp_parser_lambda_expression): Don't parse the body of a lambda in unevaluated context. From-SVN: r208817 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 47c989098ca4..23a2c8fc3f35 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-03-25 Jason Merrill + PR c++/60375 + * parser.c (cp_parser_lambda_expression): Don't parse the body of + a lambda in unevaluated context. + PR c++/60628 * decl.c (create_array_type_for_decl): Complain about array of auto. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4ca08a13d643..2e117a53155c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8718,14 +8718,17 @@ cp_parser_lambda_expression (cp_parser* parser) { tree lambda_expr = build_lambda_expr (); tree type; - bool ok; + bool ok = true; LAMBDA_EXPR_LOCATION (lambda_expr) = cp_lexer_peek_token (parser->lexer)->location; if (cp_unevaluated_operand) - error_at (LAMBDA_EXPR_LOCATION (lambda_expr), - "lambda-expression in unevaluated context"); + { + error_at (LAMBDA_EXPR_LOCATION (lambda_expr), + "lambda-expression in unevaluated context"); + ok = false; + } /* We may be in the middle of deferred access check. Disable it now. */ @@ -8770,12 +8773,15 @@ cp_parser_lambda_expression (cp_parser* parser) /* By virtue of defining a local class, a lambda expression has access to the private variables of enclosing classes. */ - ok = cp_parser_lambda_declarator_opt (parser, lambda_expr); + ok &= cp_parser_lambda_declarator_opt (parser, lambda_expr); if (ok) cp_parser_lambda_body (parser, lambda_expr); else if (cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE)) - cp_parser_skip_to_end_of_block_or_statement (parser); + { + if (cp_parser_skip_to_closing_brace (parser)) + cp_lexer_consume_token (parser->lexer); + } /* The capture list was built up in reverse order; fix that now. */ LAMBDA_EXPR_CAPTURE_LIST (lambda_expr) diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C index 898f685aa570..dcea1690dded 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C @@ -5,3 +5,5 @@ template struct A { }; A a; // { dg-error "lambda.*unevaluated context" } +// { dg-prune-output "template argument" } +// { dg-prune-output "invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval2.C new file mode 100644 index 000000000000..14cb29874200 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval2.C @@ -0,0 +1,7 @@ +// PR c++/60375 +// { dg-do compile { target c++11 } } + +struct A +{ + decltype( [](){ return this; }() ) x; // { dg-error "unevaluated" } +};