]> git.gag.com Git - fw/sdcc/commitdiff
the next step towards advanced typechecking
authorjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 15 Jun 2001 18:45:44 +0000 (18:45 +0000)
committerjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 15 Jun 2001 18:45:44 +0000 (18:45 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@893 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCC.y
src/SDCCast.c
src/SDCCicode.c
src/SDCCmem.c
src/SDCCsymt.c
src/SDCCsymt.h

index ff6fd1b0c60e9f4f6d2f31919456d221298ef380..63b27ed3b85b837dba8575fb32f456b2cc23b799 100644 (file)
@@ -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);
index e76c932eefa9753782cd578ddf955fad1d329c88..1874a67d0d8b3da7a0d769e15afc209970b7288b 100644 (file)
@@ -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++;
index 02482ec773f07b88bfb9e92d25b27757063fe448..c1b48ed8583914429878f857e5b7188f9cee105d 100644 (file)
@@ -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;
 }
 
index cb1ecb0e94950563d2718c0cc3d4ac5ee01e95f7..95417b90223d0ed26de766a3cf809b616dc6f922 100644 (file)
@@ -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 */
index e83e56f3116336ab452de3c04eae6e917dcf72bc..b70f3af3df49a1b27133e237a2d4a213b11da0a6 100644 (file)
@@ -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))
     {
index 5414d11994731f8552be268f8fe96bde6d81fdee..6836371c022f0e85e1434d19e14f8dc7d7da1612 100644 (file)
@@ -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 *);