From 5e8c38c2de194a8eb5733977325c982838f04390 Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Tue, 22 Aug 2006 18:51:40 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 4 ++-- gcc/testsuite/g++.dg/template/typeid-template-argument.C | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/typeid-template-argument.C 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 + + 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 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 struct A; + +int i = sizeof(A); // { dg-error "operator cannot appear in a constant-expression|template argument 1 is invalid" }