From: johanknol Date: Mon, 7 Jan 2002 11:25:58 +0000 (+0000) Subject: fixed bug #498744 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=74cc47c04fa325773b214f28ff1d0ecfe4d5205d;p=fw%2Fsdcc fixed bug #498744 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1778 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 41df8a65..0f8822ba 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -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; diff --git a/support/Util/SDCCerr.c b/support/Util/SDCCerr.c index e28cb9aa..8dbe0fb9 100644 --- a/support/Util/SDCCerr.c +++ b/support/Util/SDCCerr.c @@ -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" }, }; /* diff --git a/support/Util/SDCCerr.h b/support/Util/SDCCerr.h index e8df9922..5bf10a80 100644 --- a/support/Util/SDCCerr.h +++ b/support/Util/SDCCerr.h @@ -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.