re PR c++/18123 (ICE on templated enum)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Thu, 2 Dec 2004 11:34:56 +0000 (11:34 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Thu, 2 Dec 2004 11:34:56 +0000 (11:34 +0000)
PR c++/18123
* parser.c (cp_parser_type_specifier): Catch template declaration
of enum.

* g++.dg/parse/enum2.C: New test.
* g++.old-deja/g++.pt/enum5.C: Adjust error location.

From-SVN: r91630

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/enum2.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.pt/enum5.C

index eff52c90e813b2eaa9cdc6c70ef6da54aa5542c5..4ad1c6e6cecd8688bd99a24f93d3af897abb3146 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/18123
+       * parser.c (cp_parser_type_specifier): Catch template declaration
+       of enum.
+
 2004-12-01  Matt Austern  <austern@apple.com>
 
        * name-lookup.c (namespace_binding): Omit alias check for global namespace.
index 3e25076f07536292b55a86e99d2424b4888ec5cb..51b8f100b344c433cb9b5de35d4e118f0a58f2c2 100644 (file)
@@ -9130,7 +9130,15 @@ cp_parser_type_specifier (cp_parser* parser,
              && cp_lexer_peek_nth_token (parser->lexer, 3)->type
                 == CPP_OPEN_BRACE))
        {
-         type_spec = cp_parser_enum_specifier (parser);
+         if (parser->num_template_parameter_lists)
+           {
+             error ("template declaration of %qs", "enum");
+             cp_parser_skip_to_end_of_block_or_statement (parser);
+             type_spec = error_mark_node;
+           }
+         else
+           type_spec = cp_parser_enum_specifier (parser);
+
          if (declares_class_or_enum)
            *declares_class_or_enum = 2;
          if (decl_specs)
index 7842f6326e8697e202f9fb7052a84dc3ccc588b8..84eae74e3ceef9ba5e9c216158da0581d142d203 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/18123
+       * g++.dg/parse/enum2.C: New test.
+       * g++.old-deja/g++.pt/enum5.C: Adjust error location.
+
 2004-12-02  Nick Clifton  <nickc@redhat.com>
 
        * gcc.target/xstormy16: New test directory.
diff --git a/gcc/testsuite/g++.dg/parse/enum2.C b/gcc/testsuite/g++.dg/parse/enum2.C
new file mode 100644 (file)
index 0000000..f29d3b5
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18123: ICE pushing tag from invalid template.
+
+template<int> enum E { e }; // { dg-error "template declaration" }
index a7c5ea3e5622829c71e2a7d9b4ddd043cf2d8b2f..d4eea4f9bff09d9953f5b85c4ea7c9e6b6409ee9 100644 (file)
@@ -1,4 +1,4 @@
 // { dg-do assemble  }
 
-template <>
-enum E {e}; // { dg-error "" } template declaration of enum
+template <> // { dg-error "" } template declaration of enum
+enum E {e};