* src/SDCC.y: fixed bug #1291133: duplicate members across enum(s)
authorborutr <borutr@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 14 Feb 2007 19:52:54 +0000 (19:52 +0000)
committerborutr <borutr@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 14 Feb 2007 19:52:54 +0000 (19:52 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4632 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCC.y

index 71ce58743072d9324d4a99572b17ded4123ad37d..3b2259d35b509d64daf8eadddb135a8e1eb15e0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-02-14 Borut Razem <borut.razem AT siol.net>
+
+       * src/SDCC.y: fixed bug #1291133: duplicate members across enum(s)
+
 2007-02-12 Maarten Brock <sourceforge.brock AT dse.nl>
 
        * src/SDCCicode.c (geniCodeAssign): return (itemp) right instead of left
index 1ffd9a4e482271869e67eba4f9169711be17613d..79d6024b1372fbf2b14b6c74824536dfeae5bc07 100644 (file)
@@ -962,40 +962,37 @@ enum_specifier
    ;
 
 enumerator_list
-   : enumerator
-   | enumerator_list ',' {
-                         }
-   | enumerator_list ',' enumerator
-     {
-       symbol *dsym;
-
-       for (dsym=$1; dsym; dsym=dsym->next)
-         {
-           if (strcmp($3->name, dsym->name)==0)
-             {
-               werrorfl($3->fileDef, $3->lineDef, E_DUPLICATE_MEMBER, "enum", $3->name);
-               werrorfl(dsym->fileDef, dsym->lineDef, E_PREVIOUS_DEF);
-             }
-         }
-
-       $3->next = $1 ;
-       $$ = $3  ;
-     }
-   ;
+    : enumerator
+    | enumerator_list ','
+    | enumerator_list ',' enumerator
+      {
+        $3->next = $1 ;
+        $$ = $3  ;
+      }
+    ;
 
 enumerator
-   : identifier opt_assign_expr
-     {
-       /* make the symbol one level up */
-       $1->level-- ;
-       $1->type = copyLinkChain($2->type);
-       $1->etype= getSpec($1->type);
-       SPEC_ENUM($1->etype) = 1;
-       $$ = $1 ;
-       // do this now, so we can use it for the next enums in the list
-       addSymChain(&$1);
-     }
-   ;
+    : identifier opt_assign_expr
+      {
+        symbol *sym;
+
+        /* make the symbol one level up */
+        $1->level-- ;
+        // check if the symbol at the same level already exists
+        if ((sym = findSymWithLevel (SymbolTab, $1)) &&
+          sym->level == $1->level)
+          {
+            werrorfl ($1->fileDef, $1->lineDef, E_DUPLICATE_MEMBER, "enum", $1->name);
+            werrorfl (sym->fileDef, sym->lineDef, E_PREVIOUS_DEF);
+          }
+        $1->type = copyLinkChain ($2->type);
+        $1->etype= getSpec ($1->type);
+        SPEC_ENUM ($1->etype) = 1;
+        $$ = $1 ;
+        // do this now, so we can use it for the next enums in the list
+        addSymChain (&$1);
+      }
+    ;
 
 opt_assign_expr
    :  '='   constant_expr  {