]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/18123 (ICE on templated enum)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Thu, 2 Dec 2004 11:51:33 +0000 (11:51 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Thu, 2 Dec 2004 11:51:33 +0000 (11:51 +0000)
PR c++/18123
* parser.c (cp_parser_type_specifier): Don't create new enum
type if it is not in the form 'enum [identifier] { [...] };'.
Catch template declaration of enum.

* g++.dg/parse/enum2.C: New test.

From-SVN: r91632

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog

index d9f79a8feba9eccc993a967590c9c1d7cf0b8232..4eafeb675795ff52b9f097ecba1905a3b7245476 100644 (file)
@@ -1,3 +1,10 @@
+2004-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/18123
+       * parser.c (cp_parser_type_specifier): Don't create new enum
+       type if it is not in the form 'enum [identifier] { [...] };'.
+       Catch template declaration of enum. 
+
 2004-12-01  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/17431
index 2c29462d346e7c6b71e40103f93192bef5b1daec..d0b877ca744db5c9692139c705edb5ed1e82505d 100644 (file)
@@ -8724,21 +8724,40 @@ cp_parser_type_specifier (cp_parser* parser,
   keyword = token->keyword;
   switch (keyword)
     {
+    case RID_ENUM:
+      /* 'enum' [identifier] '{' introduces an enum-specifier;
+        'enum' <anything else> introduces an elaborated-type-specifier.  */
+      if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_OPEN_BRACE
+         || (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME
+             && cp_lexer_peek_nth_token (parser->lexer, 3)->type
+                == CPP_OPEN_BRACE))
+       {
+         if (parser->num_template_parameter_lists)
+           {
+             error ("template declaration of `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;
+         return type_spec;
+       }
+      else
+       goto elaborated_type_specifier;
+
       /* Any of these indicate either a class-specifier, or an
         elaborated-type-specifier.  */
     case RID_CLASS:
     case RID_STRUCT:
     case RID_UNION:
-    case RID_ENUM:
       /* Parse tentatively so that we can back up if we don't find a
         class-specifier or enum-specifier.  */
       cp_parser_parse_tentatively (parser);
-      /* Look for the class-specifier or enum-specifier.  */
-      if (keyword == RID_ENUM)
-       type_spec = cp_parser_enum_specifier (parser);
-      else
-       type_spec = cp_parser_class_specifier (parser);
-
+      /* Look for the class-specifier.  */
+      type_spec = cp_parser_class_specifier (parser);
       /* If that worked, we're done.  */
       if (cp_parser_parse_definitely (parser))
        {
@@ -8750,6 +8769,7 @@ cp_parser_type_specifier (cp_parser* parser,
       /* Fall through.  */
 
     case RID_TYPENAME:
+    elaborated_type_specifier:
       /* Look for an elaborated-type-specifier.  */
       type_spec = cp_parser_elaborated_type_specifier (parser,
                                                       is_friend,
index 8aa370d5960ff5aa51505a14be8c80bd576a25fe..0fe9ae52cc275a356bf0aa1efd2f1f8bd88e52a3 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/18123
+       * g++.dg/parse/enum2.C: New test.
+
 2004-12-02  Alan Modra  <amodra@bigpond.net.au>
 
        PR target/16952