aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2011-12-14 00:36:15 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2011-12-14 00:36:15 +0000
commit6fdc547369f2ae57120d8fa1eb91cbff24374a21 (patch)
treed197ef935d53902daf9e61d3930064960868693a /gcc
parent639166b250def5cb1b57500193fc414f4f142142 (diff)
downloadgcc-6fdc547369f2ae57120d8fa1eb91cbff24374a21.zip
gcc-6fdc547369f2ae57120d8fa1eb91cbff24374a21.tar.gz
gcc-6fdc547369f2ae57120d8fa1eb91cbff24374a21.tar.bz2
re PR c++/51464 ([c++0x] ICE with invalid use of [])
/cp 2011-12-13 Paolo Carlini <paolo.carlini@oracle.com> 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 <paolo.carlini@oracle.com> PR c++/51464 * g++.dg/cpp0x/lambda/lambda-ice6.C: New. From-SVN: r182320
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/parser.c2
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C4
5 files changed, 21 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3e7abcc..23748d8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2011-12-13 Paolo Carlini <paolo.carlini@oracle.com>
+
+ 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 <fabien@gcc.gnu.org>
PR c++/14258
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index ae15eb1..49b508c 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 4b1ec46..7e1a396 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 7a66fa4..5011d2c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-13 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/51464
+ * g++.dg/cpp0x/lambda/lambda-ice6.C: New.
+
2011-12-13 Andrew Pinski <apinski@cavium.com>
Adam Nemet <anemet@caviumnetworks.com>
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 0000000..ddf3527
--- /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<int = sizeof([])> struct A {}; // { dg-error "lambda" }