diff options
| author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-08-22 18:51:40 +0000 |
|---|---|---|
| committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-08-22 18:51:40 +0000 |
| commit | 4a430fd7ccc7599320ec7e20849d61563fa3e6e2 (patch) | |
| tree | 65053aaf4e88e020c6247d06b6b64c2c4f293881 | |
| parent | b5de1aa4059bc18a6c07ec20df7c7118be36bc8d (diff) | |
| download | ppe42-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/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 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" } |

