diff options
author | Simon Martin <simartin@users.sourceforge.net> | 2006-08-22 18:51:40 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2006-08-22 14:51:40 -0400 |
commit | 5e8c38c2de194a8eb5733977325c982838f04390 (patch) | |
tree | 65053aaf4e88e020c6247d06b6b64c2c4f293881 | |
parent | 8e30dcf34530478bd343bce3771bb0c0f979ed73 (diff) | |
download | gcc-5e8c38c2de194a8eb5733977325c982838f04390.zip gcc-5e8c38c2de194a8eb5733977325c982838f04390.tar.gz gcc-5e8c38c2de194a8eb5733977325c982838f04390.tar.bz2 |
re PR c++/28420 (ICE with "typeid" as template parameter)
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().
From-SVN: r116330
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typeid-template-argument.C | 7 |
3 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 22dbdba..9124177 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 d015ae1..729d0ca 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 0000000..38dbfd3 --- /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" } |