decl.c (start_enum): Show location of previous definition.
authorNathan Sidwell <nathan@acm.org>
Tue, 3 Aug 1999 14:24:07 +0000 (14:24 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 3 Aug 1999 14:24:07 +0000 (14:24 +0000)
        * decl.c (start_enum): Show location of previous definition.
        * parse.y (enumlist_opt): New reduction.
        (structsp): Simplify enum rules to use enumlist_opt.

From-SVN: r28471

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/parse.y

index 5232c7288599dee1d7713c108c7752cbb79c8af9..94d0b96c25ef48ee02a99f4d6b8150bf72dc825f 100644 (file)
@@ -1,3 +1,9 @@
+1999-08-03  Nathan Sidwell  <nathan@acm.org>
+
+       * decl.c (start_enum): Show location of previous definition.
+       * parse.y (enumlist_opt): New reduction.
+       (structsp): Simplify enum rules to use enumlist_opt.
+
 1999-08-03  Jason Merrill  <jason@yorick.cygnus.com>
 
        * lex.c (yyprint): Handle PFUNCNAME.
index eedf277d0cf403e74a953f1e27a22b2138c92588..498384b0ae6d968a812b5e8aad121e0b931ae3f7 100644 (file)
@@ -12642,7 +12642,10 @@ start_enum (name)
     enumtype = lookup_tag (ENUMERAL_TYPE, name, b, 1);
 
   if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE)
-    cp_error ("multiple definition of `%#T'", enumtype);
+    {
+      cp_error ("multiple definition of `%#T'", enumtype);
+      cp_error_at ("previous definition here", enumtype);
+    }
   else
     {
       enumtype = make_node (ENUMERAL_TYPE);
index 555b9882956c28c0d5c7f41d68223e2d6716d657..9551c15d7dd170c0a19d550e340b7a9bc19f1fc9 100644 (file)
@@ -211,7 +211,7 @@ empty_parms ()
 %type <ttype> component_declarator component_declarator0
 %type <ttype> notype_component_declarator notype_component_declarator0
 %type <ttype> after_type_component_declarator after_type_component_declarator0
-%type <ttype> enumlist enumerator
+%type <ttype> enumlist_opt enumlist enumerator
 %type <ttype> absdcl cv_qualifiers
 %type <ttype> direct_abstract_declarator conversion_declarator
 %type <ttype> new_declarator direct_new_declarator
@@ -2104,32 +2104,24 @@ structsp:
                { $<itype>3 = suspend_momentary ();
                  $<ttype>$ = current_enum_type;
                  current_enum_type = start_enum ($2); }
-         enumlist maybecomma_warn '}'
+         enumlist_opt '}'
                { TYPE_VALUES (current_enum_type) = $5;
                  $$.t = finish_enum (current_enum_type);
                  $$.new_type_flag = 1;
                  current_enum_type = $<ttype>4;
                  resume_momentary ((int) $<itype>3);
                  check_for_missing_semicolon ($$.t); }
-       | ENUM identifier '{' '}'
-               { $$.t = finish_enum (start_enum ($2));
-                 $$.new_type_flag = 1;
-                 check_for_missing_semicolon ($$.t); }
        | ENUM '{'
                { $<itype>2 = suspend_momentary ();
                  $<ttype>$ = current_enum_type;
                  current_enum_type = start_enum (make_anon_name ()); }
-         enumlist maybecomma_warn '}'
+         enumlist_opt '}'
                 { TYPE_VALUES (current_enum_type) = $4;
                  $$.t = finish_enum (current_enum_type);
                  $$.new_type_flag = 1;
                  current_enum_type = $<ttype>3;
                  resume_momentary ((int) $<itype>1);
                  check_for_missing_semicolon ($$.t); }
-       | ENUM '{' '}'
-               { $$.t = finish_enum (start_enum (make_anon_name()));
-                 $$.new_type_flag = 1;
-                 check_for_missing_semicolon ($$.t); }
        | ENUM identifier
                { $$.t = xref_tag (enum_type_node, $2, 1); 
                  $$.new_type_flag = 0; }
@@ -2681,6 +2673,12 @@ notype_component_declarator:
                  cplus_decl_attributes ($$, $3, prefix_attributes); }
        ;
 
+enumlist_opt:
+         enumlist maybecomma_warn
+       | maybecomma_warn
+         { $$ = NULL_TREE; }
+       ;
+
 /* We chain the enumerators in reverse order.
    Because of the way enums are built, the order is
    insignificant.  Take advantage of this fact.  */