From 66c77d3e961fcabbc00397897036656cc3808d22 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Thu, 2 Dec 2004 11:51:33 +0000 Subject: [PATCH] re PR c++/18123 (ICE on templated enum) 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 | 7 +++++++ gcc/cp/parser.c | 34 +++++++++++++++++++++++++++------- gcc/testsuite/ChangeLog | 5 +++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9f79a8feba9..4eafeb675795 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2004-12-02 Kriang Lerdsuwanakij + + 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 PR c++/17431 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 2c29462d346e..d0b877ca744d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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' 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8aa370d5960f..0fe9ae52cc27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-02 Kriang Lerdsuwanakij + + PR c++/18123 + * g++.dg/parse/enum2.C: New test. + 2004-12-02 Alan Modra PR target/16952 -- 2.47.2