From: johanknol Date: Fri, 15 Jun 2001 18:45:44 +0000 (+0000) Subject: the next step towards advanced typechecking X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=9bc086053cc46e3e4a892630227c5dd4ac785e3c;p=fw%2Fsdcc the next step towards advanced typechecking git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@893 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/SDCC.y b/src/SDCC.y index ff6fd1b0..63b27ed3 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -709,24 +709,23 @@ struct_or_union ; opt_stag - : stag - | { /* synthesize a name add to structtable */ - $$ = newStruct(genSymName(NestLevel)) ; - $$->level = NestLevel ; - addSym (StructTab, $$, $$->tag,$$->level,currBlockno) ; - } - ; +: stag +| { /* synthesize a name add to structtable */ + $$ = newStruct(genSymName(NestLevel)) ; + $$->level = NestLevel ; + addSym (StructTab, $$, $$->tag,$$->level,currBlockno, 0); +}; stag - : identifier { /* add name to structure table */ - $$ = findSymWithBlock (StructTab,$1,currBlockno); - if (! $$ ) { - $$ = newStruct($1->name) ; - $$->level = NestLevel ; - addSym (StructTab, $$, $$->tag,$$->level,currBlockno) ; - } - } - ; +: identifier { /* add name to structure table */ + $$ = findSymWithBlock (StructTab,$1,currBlockno); + if (! $$ ) { + $$ = newStruct($1->name) ; + $$->level = NestLevel ; + addSym (StructTab, $$, $$->tag,$$->level,currBlockno,0); + } +}; + struct_declaration_list : struct_declaration @@ -799,7 +798,7 @@ enum_specifier (csym && csym->level == $2->level)) werror(E_DUPLICATE_TYPEDEF,csym->name); - addSym ( enumTab,$2,$2->name,$2->level,$2->block); + addSym ( enumTab,$2,$2->name,$2->level,$2->block, 0); addSymChain ($4); allocVariables (reverseSyms($4)); $$ = copyLinkChain(cenum->type); diff --git a/src/SDCCast.c b/src/SDCCast.c index e76c932e..1874a67d 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -611,6 +611,14 @@ processParms (ast * func, if (!defParm && !actParm) return 0; + if (defParm) { + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "addSym: %s ", defParm->name); + } + /* make sure the type is complete and sane */ + checkTypeSanity(defParm->etype, defParm->name); + } + /* if the function is being called via a pointer & */ /* it has not been defined a reentrant then we cannot */ /* have parameters */ @@ -1034,7 +1042,7 @@ gatherAutoInit (symbol * autoChain) /* insert the symbol into the symbol table */ /* with level = 0 & name = rname */ newSym = copySymbol (sym); - addSym (SymbolTab, newSym, newSym->name, 0, 0); + addSym (SymbolTab, newSym, newSym->name, 0, 0, 1); /* now lift the code to main */ if (IS_AGGREGATE (sym->type)) @@ -3332,7 +3340,7 @@ createLabel (symbol * label, ast * stmnt) if ((csym = findSym (LabelTab, NULL, name))) werror (E_DUPLICATE_LABEL, label->name); else - addSym (LabelTab, label, name, label->level, 0); + addSym (LabelTab, label, name, label->level, 0, 0); label->islbl = 1; label->key = labelKey++; diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 02482ec7..c1b48ed8 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -539,7 +539,7 @@ newiTempLabel (char *s) itmplbl->isitmp = 1; itmplbl->islbl = 1; itmplbl->key = labelKey++; - addSym (LabelTab, itmplbl, itmplbl->name, 0, 0); + addSym (LabelTab, itmplbl, itmplbl->name, 0, 0, 0); return itmplbl; } @@ -557,7 +557,7 @@ newiTempPreheaderLabel () itmplbl->isitmp = 1; itmplbl->islbl = 1; itmplbl->key = labelKey++; - addSym (LabelTab, itmplbl, itmplbl->name, 0, 0); + addSym (LabelTab, itmplbl, itmplbl->name, 0, 0, 0); return itmplbl; } diff --git a/src/SDCCmem.c b/src/SDCCmem.c index cb1ecb0e..95417b90 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -545,7 +545,7 @@ deallocParms (value * val) strcpy (lval->sym->rname, buffer); strcpy (lval->name, strcpy (lval->sym->name, lval->sym->rname)); addSym (SymbolTab, lval->sym, lval->sym->name, - lval->sym->level, lval->sym->block); + lval->sym->level, lval->sym->block, 1); lval->sym->_isparm = 1; addSet (&operKeyReset, lval->sym); } @@ -794,7 +794,7 @@ allocVariables (symbol * symChain) if (csym && csym->level == sym->level) werror (E_DUPLICATE_TYPEDEF, sym->name); - addSym (TypedefTab, sym, sym->name, sym->level, sym->block); + addSym (TypedefTab, sym, sym->name, sym->level, sym->block, 0); continue; /* go to the next one */ } /* make sure it already exist */ diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index e83e56f3..b70f3af3 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -98,16 +98,16 @@ addSym (bucket ** stab, void *sym, char *sname, int level, - int block) + int block, + int checkType) { int i; /* index into the hash Table */ bucket *bp; /* temp bucket * */ - if (getenv("DEBUG_SANITY")) { - fprintf (stderr, "addSym: %s ", sname); - } - /* Make sure sym is a symbol and not a structdef */ - if (StructTab!=stab) { + if (checkType) { + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "addSym: %s ", sname); + } /* make sure the type is complete and sane */ checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name); } @@ -478,7 +478,7 @@ void checkTypeSanity(sym_link *etype, char *name) { noun=nounName(etype); if (getenv("DEBUG_SANITY")) { - fprintf (stderr, "checking sanity for %s\n", name); + fprintf (stderr, "checking sanity for %s %x\n", name, (int)etype); } if ((SPEC_NOUN(etype)==V_CHAR || @@ -938,7 +938,7 @@ addSymChain (symbol * symHead) /* delete current entry */ deleteSym (SymbolTab, csym, csym->name); /* add new entry */ - addSym (SymbolTab, sym, sym->name, sym->level, sym->block); + addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); } else /* not extern */ werror (E_DUPLICATE, sym->name); @@ -956,7 +956,7 @@ addSymChain (symbol * symHead) werror (W_EXTERN_MISMATCH, csym->name); } } - addSym (SymbolTab, sym, sym->name, sym->level, sym->block); + addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); } } @@ -1579,6 +1579,7 @@ checkFunction (symbol * sym) { symbol *csym; value *exargs, *acargs; + value *checkValue; int argCnt = 0; if (getenv("DEBUG_SANITY")) { @@ -1666,7 +1667,12 @@ checkFunction (symbol * sym) exargs && acargs; exargs = exargs->next, acargs = acargs->next, argCnt++) { - value *checkValue; + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "checkFunction: %s ", exargs->name); + } + /* make sure the type is complete and sane */ + checkTypeSanity(exargs->etype, exargs->name); + /* If the actual argument is an array, any prototype * will have modified it to a pointer. Duplicate that * change here. @@ -1696,7 +1702,7 @@ checkFunction (symbol * sym) /* replace with this defition */ sym->cdef = csym->cdef; deleteSym (SymbolTab, csym, csym->name); - addSym (SymbolTab, sym, sym->name, sym->level, sym->block); + addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); if (IS_EXTERN (csym->etype) && ! IS_EXTERN (sym->etype)) { diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index 5414d119..6836371c 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -451,7 +451,7 @@ void cdbSymbol (symbol *, FILE *, int, int); void cdbStructBlock (int, FILE *); void initHashT (); bucket *newBucket (); -void addSym (bucket **, void *, char *, int, int); +void addSym (bucket **, void *, char *, int, int, int checkType); void deleteSym (bucket **, void *, char *); void *findSym (bucket **, void *, const char *); void *findSymWithLevel (bucket **, struct symbol *);