re PR c++/28420 (ICE with "typeid" as template parameter)
authorSimon Martin <simartin@users.sourceforge.net>
Tue, 22 Aug 2006 18:51:40 +0000 (18:51 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 22 Aug 2006 18:51:40 +0000 (14:51 -0400)
        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
gcc/cp/parser.c
gcc/testsuite/g++.dg/template/typeid-template-argument.C [new file with mode: 0644]

index 22dbdba69368fb826df4e7f0cb97b5d5d768dadf..912417794628bee94629964ee3415eca4d5af609 100644 (file)
@@ -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
index d015ae1d7a144cf1d9a8ba8278a9e0ee4013bdcd..729d0ca488c95cf35af77811091bd35a12656013 100644 (file)
@@ -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 (file)
index 0000000..38dbfd3
--- /dev/null
@@ -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" }