aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSimon Martin <simartin@users.sourceforge.net>2006-12-31 16:09:07 +0000
committerSimon Martin <simartin@gcc.gnu.org>2006-12-31 16:09:07 +0000
commit7c2da05e604c27549afadf4df26c679aead5f414 (patch)
treeae5544b4685448570f3fe482042f9086491c090c /gcc
parent72ff1a96091ff6a1fb93e1c7087dc17f3c6c5d4b (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c21
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/template22.C5
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" } */