From: Simon Martin Date: Sun, 31 Dec 2006 16:09:07 +0000 (+0000) Subject: re PR c++/29731 (ICE with statement expression as template parameter) X-Git-Tag: releases/gcc-4.3.0~7782 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c2da05e604c27549afadf4df26c679aead5f414;p=thirdparty%2Fgcc.git re PR c++/29731 (ICE with statement expression as template parameter) 2006-12-31 Simon Martin PR c++/29731 * parser.c (cp_parser_primary_expression): Return error_mark_node when a statement-expression is found outside of a function body. From-SVN: r120299 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8c0e170a6da0..ae5beb2a624b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-12-31 Simon Martin + + PR c++/29731 + * parser.c (cp_parser_primary_expression): Return error_mark_node when + a statement-expression is found outside of a function body. + 2006-12-28 Kazu Hirata * cp-tree.h (TYPE_NAMESPACE_SCOPE_P, TYPE_FUNCTION_SCOPE_P): diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ae2b4a028031..82cb79698589 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3024,13 +3024,20 @@ cp_parser_primary_expression (cp_parser *parser, at class or namespace scope. */ if (!parser->in_function_body) - error ("statement-expressions are allowed only inside functions"); - /* Start the statement-expression. */ - expr = begin_stmt_expr (); - /* Parse the compound-statement. */ - cp_parser_compound_statement (parser, expr, false); - /* Finish up. */ - expr = finish_stmt_expr (expr, false); + { + error ("statement-expressions are allowed only inside functions"); + cp_parser_skip_to_end_of_block_or_statement (parser); + expr = error_mark_node; + } + else + { + /* Start the statement-expression. */ + expr = begin_stmt_expr (); + /* Parse the compound-statement. */ + cp_parser_compound_statement (parser, expr, false); + /* Finish up. */ + expr = finish_stmt_expr (expr, false); + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a24138920b20..df63017b96c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-12-31 Simon Martin + + PR c++/29731 + * g++.dg/parse/template22.C: New test. + 2006-12-31 Richard Guenther PR middle-end/30338 diff --git a/gcc/testsuite/g++.dg/parse/template22.C b/gcc/testsuite/g++.dg/parse/template22.C new file mode 100644 index 000000000000..c93375685253 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template22.C @@ -0,0 +1,5 @@ +/* PR c++/29731. This used to ICE in uses_template_parms. */ + +template struct A {}; + +A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */