summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-22 18:51:40 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-22 18:51:40 +0000
commit4a430fd7ccc7599320ec7e20849d61563fa3e6e2 (patch)
tree65053aaf4e88e020c6247d06b6b64c2c4f293881
parentb5de1aa4059bc18a6c07ec20df7c7118be36bc8d (diff)
downloadppe42-gcc-4a430fd7ccc7599320ec7e20849d61563fa3e6e2.tar.gz
ppe42-gcc-4a430fd7ccc7599320ec7e20849d61563fa3e6e2.zip
PR c++/28420
* parser.c (cp_parser_postfix_expression): Make sure that the saved value for parser->type_definition_forbidden_message is restored before returning to avoid an invalid free(). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116330 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/testsuite/g++.dg/template/typeid-template-argument.C7
3 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 22dbdba6936..91241779462 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2006-08-22 Simon Martin <simartin@users.sourceforge.net>
+
+ PR c++/28420
+ * parser.c (cp_parser_postfix_expression): Make sure that the
+ saved value for parser->type_definition_forbidden_message is
+ restored before returning to avoid an invalid free().
+
2006-08-22 Jason Merrill <jason@redhat.com>
PR c++/28659
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d015ae1d7a1..729d0ca488c 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -4076,12 +4076,12 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p)
/* Look for the `)' token. */
cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
}
+ /* Restore the saved message. */
+ parser->type_definition_forbidden_message = saved_message;
/* `typeid' may not appear in an integral constant expression. */
if (cp_parser_non_integral_constant_expression(parser,
"`typeid' operator"))
return error_mark_node;
- /* Restore the saved message. */
- parser->type_definition_forbidden_message = saved_message;
}
break;
diff --git a/gcc/testsuite/g++.dg/template/typeid-template-argument.C b/gcc/testsuite/g++.dg/template/typeid-template-argument.C
new file mode 100644
index 00000000000..38dbfd3f3e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/typeid-template-argument.C
@@ -0,0 +1,7 @@
+// This used to ICE (PR28420)
+
+// { dg-do compile }
+
+template<int> struct A;
+
+int i = sizeof(A<typeid>); // { dg-error "operator cannot appear in a constant-expression|template argument 1 is invalid" }
OpenPOWER on IntegriCloud