X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.y;h=c5944eaf8dd0e8b4fce9aa2c398fc8810dd7228e;hb=67613b6eceb41c8a242c2556a0f59311adb0b388;hp=9c9eee76f7dd8da977476c3385f7b229da95e30b;hpb=53638777280c2f658894958794c3e7886a4294b5;p=fw%2Fsdcc diff --git a/src/SDCC.y b/src/SDCC.y index 9c9eee76..c5944eaf 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -702,6 +702,8 @@ sfr_reg_bit $$ = newLink(SPECIFIER) ; SPEC_NOUN($$) = V_SBIT; SPEC_SCLS($$) = S_SBIT; + SPEC_BLEN($$) = 1; + SPEC_BSTR($$) = 0; ignoreTypedefType = 1; } | sfr_attributes @@ -748,17 +750,19 @@ struct_or_union_specifier // check for errors in structure members for (sym=$5; sym; sym=sym->next) { if (IS_ABSOLUTE(sym->etype)) { - werrorfl(filename, sym->lineDef, E_NOT_ALLOWED, "'at'"); + werrorfl(sym->fileDef, sym->lineDef, E_NOT_ALLOWED, "'at'"); SPEC_ABSA(sym->etype) = 0; } if (IS_SPEC(sym->etype) && SPEC_SCLS(sym->etype)) { - werrorfl(filename, sym->lineDef, E_NOT_ALLOWED, "storage class"); + werrorfl(sym->fileDef, sym->lineDef, E_NOT_ALLOWED, "storage class"); + printTypeChainRaw (sym->type,NULL); SPEC_SCLS(sym->etype) = 0; } for (dsym=sym->next; dsym; dsym=dsym->next) { - if (strcmp(sym->name, dsym->name)==0) { - werrorfl(filename, sym->lineDef, E_DUPLICATE_MEMBER, + if (*dsym->name && strcmp(sym->name, dsym->name)==0) { + werrorfl(sym->fileDef, sym->lineDef, E_DUPLICATE_MEMBER, $1==STRUCT ? "struct" : "union", sym->name); + werrorfl(dsym->fileDef, dsym->lineDef, E_PREVIOUS_DEF); } } } @@ -767,7 +771,8 @@ struct_or_union_specifier sdef = $2 ; sdef->fields = reverseSyms($5) ; /* link the fields */ sdef->size = compStructSize($1,sdef); /* update size of */ - + promoteAnonStructs ($1, sdef); + /* Create the specifier */ $$ = newLink (SPECIFIER) ; SPEC_NOUN($$) = V_STRUCT; @@ -894,45 +899,35 @@ struct_declarator else $1->bitVar = bitsize; } + | { $$ = newSymbol ("", NestLevel) ; } + ; enum_specifier : ENUM '{' enumerator_list '}' { - symbol *sym, *dsym; - char _error=0; - - // check for duplicate enums - for (sym=$3; sym; sym=sym->next) { - for (dsym=sym->next; dsym; dsym=dsym->next) { - if (strcmp(sym->name, dsym->name)==0) { - werrorfl(filename, sym->lineDef, E_DUPLICATE_MEMBER, "enum", sym->name); - _error++; - } - } - } - if (_error==0) { - $$ = copyLinkChain(cenum->type); - } else { - $$ = newIntLink(); - SPEC_NOUN($$)=0; - } + $$ = newEnumType ($3); //copyLinkChain(cenum->type); + SPEC_SCLS(getSpec($$)) = 0; } | ENUM identifier '{' enumerator_list '}' { symbol *csym ; + sym_link *enumtype; + + csym=findSym(enumTab,$2,$2->name); + if ((csym && csym->level == $2->level)) + { + werrorfl($2->fileDef, $2->lineDef, E_DUPLICATE_TYPEDEF,csym->name); + werrorfl(csym->fileDef, csym->lineDef, E_PREVIOUS_DEF); + } - $2->type = copyLinkChain(cenum->type); - $2->etype = getSpec($2->type); - /* add this to the enumerator table */ - if (!(csym=findSym(enumTab,$2,$2->name)) && - (csym && csym->level == $2->level)) - werror(E_DUPLICATE_TYPEDEF,csym->name); + enumtype = newEnumType ($4); //copyLinkChain(cenum->type); + SPEC_SCLS(getSpec(enumtype)) = 0; + $2->type = enumtype; - addSym ( enumTab,$2,$2->name,$2->level,$2->block, 0); - //addSymChain ($4); - //allocVariables (reverseSyms($4)); - $$ = copyLinkChain(cenum->type); - SPEC_SCLS(getSpec($$)) = 0 ; + /* add this to the enumerator table */ + if (!csym) + addSym ( enumTab,$2,$2->name,$2->level,$2->block, 0); + $$ = copyLinkChain(enumtype); } | ENUM identifier { symbol *csym ; @@ -944,8 +939,6 @@ enum_specifier $$ = newLink(SPECIFIER) ; SPEC_NOUN($$) = V_INT ; } - - SPEC_SCLS(getSpec($$)) = 0 ; } ; @@ -953,10 +946,22 @@ enumerator_list : enumerator | enumerator_list ',' { } - | enumerator_list ',' enumerator { - $3->next = $1 ; - $$ = $3 ; - } + | 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 @@ -976,8 +981,15 @@ enumerator opt_assign_expr : '=' constant_expr { value *val ; - - val = constExprValue($2,TRUE); + + val = constExprValue($2,TRUE); + if (!IS_INT(val->type) && !IS_CHAR(val->type)) + { + werror(E_ENUM_NON_INTEGER); + SNPRINTF(lbuff, sizeof(lbuff), + "%d",(int) floatFromVal(val)); + val = constVal(lbuff); + } $$ = cenum = val ; } | { @@ -1021,21 +1033,32 @@ declarator2_function_attributes : function_declarator2 { $$ = $1 ; } | function_declarator2 function_attribute { // copy the functionAttributes (not the args and hasVargs !!) - sym_link *funcType=$1->etype; - struct value *args=FUNC_ARGS(funcType); - unsigned hasVargs=FUNC_HASVARARGS(funcType); - - memcpy (&funcType->funcAttrs, &$2->funcAttrs, - sizeof($2->funcAttrs)); + struct value *args; + unsigned hasVargs; + sym_link *funcType=$1->type; - FUNC_ARGS(funcType)=args; - FUNC_HASVARARGS(funcType)=hasVargs; - - // just to be sure - memset (&$2->funcAttrs, 0, - sizeof($2->funcAttrs)); + while (funcType && !IS_FUNC(funcType)) + funcType = funcType->next; + + if (!funcType) + werror (E_FUNC_ATTR); + else + { + args=FUNC_ARGS(funcType); + hasVargs=FUNC_HASVARARGS(funcType); + + memcpy (&funcType->funcAttrs, &$2->funcAttrs, + sizeof($2->funcAttrs)); + + FUNC_ARGS(funcType)=args; + FUNC_HASVARARGS(funcType)=hasVargs; + + // just to be sure + memset (&$2->funcAttrs, 0, + sizeof($2->funcAttrs)); - addDecl ($1,0,$2); + addDecl ($1,0,$2); + } } ; @@ -1078,26 +1101,26 @@ function_declarator2 | declarator2 '(' { NestLevel++ ; currBlockno++; } parameter_type_list ')' { + sym_link *funcType; addDecl ($1,FUNCTION,NULL) ; + + funcType = $1->type; + while (funcType && !IS_FUNC(funcType)) + funcType = funcType->next; - FUNC_HASVARARGS($1->type) = IS_VARG($4); - FUNC_ARGS($1->type) = reverseVal($4); + assert (funcType); + + FUNC_HASVARARGS(funcType) = IS_VARG($4); + FUNC_ARGS(funcType) = reverseVal($4); /* nest level was incremented to take care of the parms */ NestLevel-- ; currBlockno--; // if this was a pointer (to a function) - if (IS_PTR($1->type)) { - // move the args and hasVargs to the function - FUNC_ARGS($1->etype)=FUNC_ARGS($1->type); - FUNC_HASVARARGS($1->etype)=FUNC_HASVARARGS($1->type); - memset (&$1->type->funcAttrs, 0, - sizeof($1->type->funcAttrs)); - // remove the symbol args (if any) + if (!IS_FUNC($1->type)) cleanUpLevel(SymbolTab,NestLevel+1); - } $$ = $1; }