From 6fdc547369f2ae57120d8fa1eb91cbff24374a21 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 14 Dec 2011 00:36:15 +0000 Subject: [PATCH] re PR c++/51464 ([c++0x] ICE with invalid use of []) /cp 2011-12-13 Paolo Carlini PR c++/51464 * semantics.c (begin_lambda_type): Check begin_class_definition return value for error_mark_node. * parser.c (cp_parser_lambda_expression): Check begin_lambda_type return value for error_mark_node. /testsuite 2011-12-13 Paolo Carlini PR c++/51464 * g++.dg/cpp0x/lambda/lambda-ice6.C: New. From-SVN: r182320 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/parser.c | 2 ++ gcc/cp/semantics.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C | 4 ++++ 5 files changed, 21 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3e7abcc0a35..23748d8bdd8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2011-12-13 Paolo Carlini + + PR c++/51464 + * semantics.c (begin_lambda_type): Check begin_class_definition return + value for error_mark_node. + * parser.c (cp_parser_lambda_expression): Check begin_lambda_type + return value for error_mark_node. + 2011-12-13 Fabien Chêne PR c++/14258 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ae15eb17b8d..49b508ce83a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8033,6 +8033,8 @@ cp_parser_lambda_expression (cp_parser* parser) cp_parser_lambda_introducer (parser, lambda_expr); type = begin_lambda_type (lambda_expr); + if (type == error_mark_node) + return error_mark_node; record_lambda_scope (lambda_expr); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 4b1ec46cb98..7e1a396332c 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8623,6 +8623,8 @@ begin_lambda_type (tree lambda) /* Start the class. */ type = begin_class_definition (type, /*attributes=*/NULL_TREE); + if (type == error_mark_node) + return error_mark_node; /* Cross-reference the expression and the type. */ LAMBDA_EXPR_CLOSURE (lambda) = type; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7a66fa41251..5011d2c1086 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-13 Paolo Carlini + + PR c++/51464 + * g++.dg/cpp0x/lambda/lambda-ice6.C: New. + 2011-12-13 Andrew Pinski Adam Nemet diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C new file mode 100644 index 00000000000..ddf352766eb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C @@ -0,0 +1,4 @@ +// PR c++/51464 +// { dg-options "-std=c++0x" } + +template struct A {}; // { dg-error "lambda" } -- 2.30.2