diff options
author | Simon Martin <simartin@users.sourceforge.net> | 2006-12-31 16:09:07 +0000 |
---|---|---|
committer | Simon Martin <simartin@gcc.gnu.org> | 2006-12-31 16:09:07 +0000 |
commit | 7c2da05e604c27549afadf4df26c679aead5f414 (patch) | |
tree | ae5544b4685448570f3fe482042f9086491c090c /gcc | |
parent | 72ff1a96091ff6a1fb93e1c7087dc17f3c6c5d4b (diff) | |
download | gcc-7c2da05e604c27549afadf4df26c679aead5f414.zip gcc-7c2da05e604c27549afadf4df26c679aead5f414.tar.gz gcc-7c2da05e604c27549afadf4df26c679aead5f414.tar.bz2 |
re PR c++/29731 (ICE with statement expression as template parameter)
2006-12-31 Simon Martin <simartin@users.sourceforge.net>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/template22.C | 5 |
4 files changed, 30 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8c0e170..ae5beb2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-12-31 Simon Martin <simartin@users.sourceforge.net> + + 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 <kazu@codesourcery.com> * cp-tree.h (TYPE_NAMESPACE_SCOPE_P, TYPE_FUNCTION_SCOPE_P): diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ae2b4a0..82cb796 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 a241389..df63017 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-12-31 Simon Martin <simartin@users.sourceforge.net> + + PR c++/29731 + * g++.dg/parse/template22.C: New test. + 2006-12-31 Richard Guenther <rguenther@suse.de> 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 0000000..c933756 --- /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<int> struct A {}; + +A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */ |