fixed bug #498744
authorjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 7 Jan 2002 11:25:58 +0000 (11:25 +0000)
committerjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 7 Jan 2002 11:25:58 +0000 (11:25 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1778 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCCsymt.c
support/Util/SDCCerr.c
support/Util/SDCCerr.h

index 41df8a654d1d3c98d5bf18d3adbfe7f4a19b1522..0f8822bad70f93d868bb5eca91482f1fc023bf1e 100644 (file)
@@ -1678,7 +1678,7 @@ checkFunction (symbol * sym, symbol *csym)
 
   /* check if this function is defined as calleeSaves
      then mark it as such */
-    FUNC_CALLEESAVES(sym->type) = inCalleeSaveList (sym->name);
+  FUNC_CALLEESAVES(sym->type) = inCalleeSaveList (sym->name);
 
   /* if interrupt service routine  */
   /* then it cannot have arguments */
@@ -1690,6 +1690,26 @@ checkFunction (symbol * sym, symbol *csym)
       }
     }
 
+  for (argCnt=1, acargs = FUNC_ARGS(sym->type); 
+       acargs; 
+       acargs=acargs->next, argCnt++) {
+    if (!acargs->sym) { 
+      // this can happen for reentrant functions
+      werror(E_PARAM_NAME_OMITTED, sym->name, argCnt);
+      // the show must go on: synthesize a name and symbol
+      sprintf (acargs->name, "_%s_PARM_%d", sym->name, argCnt);
+      acargs->sym = newSymbol (acargs->name, 1);
+      SPEC_OCLS (acargs->etype) = istack;
+      acargs->sym->type = copyLinkChain (acargs->type);
+      acargs->sym->etype = getSpec (acargs->sym->type);
+      acargs->sym->_isparm = 1;
+      strcpy (acargs->sym->rname, acargs->name);
+    } else if (strcmp(acargs->sym->name, acargs->sym->rname)==0) { 
+      // synthesized name
+      werror(E_PARAM_NAME_OMITTED, sym->name, argCnt);
+    }
+  }
+
   if (!csym && !(csym = findSym (SymbolTab, sym, sym->name)))
     return 1;                  /* not defined nothing more to check  */
 
@@ -1864,7 +1884,6 @@ processFuncArgs (symbol * func)
       /* synthesize a variable name */
       if (!val->sym)
        {
-
          sprintf (val->name, "_%s_PARM_%d", func->name, pNum++);
          val->sym = newSymbol (val->name, 1);
          SPEC_OCLS (val->etype) = port->mem.default_local_map;
index e28cb9aa9612d6f8bb68f52886b30f177db0575a..8dbe0fb9480f6a914f7dda27807e01147808bed6 100644 (file)
@@ -371,7 +371,9 @@ struct
 { W_CAST_STRUCT_PTR,ERROR_LEVEL_WARNING,
          "cast of struct %s * to struct %s * " },
 { W_IF_ALWAYS_TRUE, ERROR_LEVEL_WARNING,
-   "if-statement condition always true, if-statement not generated" },
+    "if-statement condition always true, if-statement not generated" },
+{ E_PARAM_NAME_OMITTED, ERROR_LEVEL_ERROR,
+    "in function %s: name omitted for parameter %d" },
 };
 
 /*
index e8df9922db8e66bff9abb4488d9fbf41464da591..5bf10a805d85b4d71eb27ca0e1e9619ca8690b4a 100644 (file)
@@ -174,6 +174,7 @@ SDCCERR - SDCC Standard error handler
 #define W_SYMBOL_NAME_TOO_LONG 156
 #define W_CAST_STRUCT_PTR 157 /* pointer to different structure types */
 #define W_IF_ALWAYS_TRUE 158
+#define E_PARAM_NAME_OMITTED 159
 
 /** Describes the maximum error level that will be logged.  Any level
  *  includes all of the levels listed after it.