X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.y;h=77182a48ce2a822077a23e66d38bf34aecf758f3;hb=b8c076fb0b337d24ca1ccaa96004b445dc632204;hp=801fad44522ec8b572b58cbe966109f8611993c6;hpb=bc526d87c6af28688d2178c816977af4dabe34d4;p=fw%2Fsdcc diff --git a/src/SDCC.y b/src/SDCC.y index 801fad44..77182a48 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -256,18 +256,20 @@ postfix_expr { $$ = newNode (CALL,$1,$3) ; $$->left->funcName = 1; } - | postfix_expr '.' identifier + | postfix_expr '.' { ignoreTypedefType = 1; } identifier { - $3 = newSymbol($3->name,NestLevel); - $3->implicit = 1; - $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($3))); -/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($3))) ; */ + ignoreTypedefType = 0; + $4 = newSymbol($4->name,NestLevel); + $4->implicit = 1; + $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($4))); +/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($4))) ; */ } - | postfix_expr PTR_OP identifier + | postfix_expr PTR_OP { ignoreTypedefType = 1; } identifier { - $3 = newSymbol($3->name,NestLevel); - $3->implicit = 1; - $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($3))); + ignoreTypedefType = 0; + $4 = newSymbol($4->name,NestLevel); + $4->implicit = 1; + $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($4))); } | postfix_expr INC_OP { $$ = newNode(INC_OP,$1,NULL);} @@ -702,6 +704,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,18 +752,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); } } } @@ -768,7 +773,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; @@ -895,6 +901,8 @@ struct_declarator else $1->bitVar = bitsize; } + | { $$ = newSymbol ("", NestLevel) ; } + ; enum_specifier @@ -909,7 +917,10 @@ enum_specifier csym=findSym(enumTab,$2,$2->name); if ((csym && csym->level == $2->level)) - werrorfl(filename, $2->lineDef, E_DUPLICATE_TYPEDEF,csym->name); + { + werrorfl($2->fileDef, $2->lineDef, E_DUPLICATE_TYPEDEF,csym->name); + werrorfl(csym->fileDef, csym->lineDef, E_PREVIOUS_DEF); + } enumtype = newEnumType ($4); //copyLinkChain(cenum->type); SPEC_SCLS(getSpec(enumtype)) = 0; @@ -944,7 +955,10 @@ enumerator_list for (dsym=$1; dsym; dsym=dsym->next) { if (strcmp($3->name, dsym->name)==0) - werrorfl(filename, $3->lineDef, E_DUPLICATE_MEMBER, "enum", $3->name); + { + werrorfl($3->fileDef, $3->lineDef, E_DUPLICATE_MEMBER, "enum", $3->name); + werrorfl(dsym->fileDef, dsym->lineDef, E_PREVIOUS_DEF); + } } $3->next = $1 ; @@ -1385,20 +1399,21 @@ critical_statement labeled_statement // : identifier ':' statement { $$ = createLabel($1,$3); } - : identifier ':' { $$ = createLabel($1,NULL); } - | CASE constant_expr ':' statement + : identifier ':' { $$ = createLabel($1,NULL); + $1->isitmp = 0; } + | CASE constant_expr ':' { if (STACK_EMPTY(swStk)) - $$ = createCase(NULL,$2,$4); + $$ = createCase(NULL,$2,NULL); else - $$ = createCase(STACK_PEEK(swStk),$2,$4); + $$ = createCase(STACK_PEEK(swStk),$2,NULL); } - | DEFAULT { $$ = newNode(DEFAULT,NULL,NULL); } ':' statement + | DEFAULT { $$ = newNode(DEFAULT,NULL,NULL); } ':' { if (STACK_EMPTY(swStk)) - $$ = createDefault(NULL,$2,$4); + $$ = createDefault(NULL,$2,NULL); else - $$ = createDefault(STACK_PEEK(swStk),$2,$4); + $$ = createDefault(STACK_PEEK(swStk),$2,NULL); } ;