From 42e428930cfc223f84acb6af4f0f72d750808cda Mon Sep 17 00:00:00 2001 From: borutr Date: Wed, 14 Feb 2007 19:52:54 +0000 Subject: [PATCH] * src/SDCC.y: fixed bug #1291133: duplicate members across enum(s) git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4632 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 4 ++++ src/SDCC.y | 61 ++++++++++++++++++++++++++---------------------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 71ce5874..3b2259d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-02-14 Borut Razem + + * src/SDCC.y: fixed bug #1291133: duplicate members across enum(s) + 2007-02-12 Maarten Brock * src/SDCCicode.c (geniCodeAssign): return (itemp) right instead of left diff --git a/src/SDCC.y b/src/SDCC.y index 1ffd9a4e..79d6024b 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -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 { -- 2.30.2