Disable the new diagnostics when a function or an array is used inside a loop condition

This commit is contained in:
Stanislav Gromov 2020-10-18 20:59:35 +08:00
parent e0cde0583e
commit 7d1b6c9294
3 changed files with 18 additions and 16 deletions

View File

@ -5214,8 +5214,7 @@ static void scanloopvariables(symstate **loopvars)
/* if the variable already has the uLOOPVAR flag set (from being used
* in an enclosing loop), we have to set the uNOLOOPVAR to exclude it
* from checks in the current loop */
if ((sym->ident==iVARIABLE || sym->ident==iREFERENCE || sym->ident==iARRAY
|| sym->ident==iREFARRAY) && (sym->usage & uLOOPVAR)!=0) {
if ((sym->ident==iVARIABLE || sym->ident==iREFERENCE) && (sym->usage & uLOOPVAR)!=0) {
/* ... but it might be already set from an enclosing loop,
* so we need to temporarily store it in "loopvars[num]" first */
(*loopvars)[num].usage |= (sym->usage & uNOLOOPVAR);
@ -5245,8 +5244,8 @@ static void testloopvariables(symstate *loopvars,int line)
if (pc_numloopvars!=0) {
warnnum=(pc_numloopvars==1) ? 250 : 251;
for (sym=start; sym!=NULL; sym=sym->next)
if ((sym->ident==iVARIABLE || sym->ident==iREFERENCE || sym->ident==iARRAY
|| sym->ident==iREFARRAY) && (sym->usage & (uLOOPVAR | uNOLOOPVAR))==uLOOPVAR)
if ((sym->ident==iVARIABLE || sym->ident==iREFERENCE)
&& (sym->usage & (uLOOPVAR | uNOLOOPVAR))==uLOOPVAR)
pc_numloopvars--;
if (pc_numloopvars==0 && warnnum==251) {
errorset(sSETPOS,line);
@ -5256,8 +5255,7 @@ static void testloopvariables(symstate *loopvars,int line)
} /* if */
for (num=0,sym=start; sym!=NULL; num++,sym=sym->next) {
if (sym->ident==iVARIABLE || sym->ident==iREFERENCE
|| sym->ident==iARRAY || sym->ident==iREFARRAY) {
if (sym->ident==iVARIABLE || sym->ident==iREFERENCE) {
if ((sym->usage & (uLOOPVAR | uNOLOOPVAR))==uLOOPVAR) {
sym->usage &= ~uLOOPVAR;
/* warn only if none of the variables used inside the loop condition

View File

@ -3309,10 +3309,8 @@ SC_FUNC void markusage(symbol *sym,int usage)
sym->lnumber=fline;
if ((usage & uREAD)!=0 && (sym->ident==iVARIABLE || sym->ident==iREFERENCE))
sym->usage &= ~uASSIGNED;
if ((usage & (uREAD | uWRITTEN))!=0
&& (sym->vclass==sLOCAL || sym->vclass==sSTATIC)
&& (sym->ident==iVARIABLE || sym->ident==iREFERENCE
|| sym->ident==iARRAY || sym->ident==iREFARRAY))
if ((usage & (uREAD | uWRITTEN))!=0 && (sym->vclass==sLOCAL || sym->vclass==sSTATIC)
&& (sym->ident==iVARIABLE || sym->ident==iREFERENCE))
markloopvariable(sym,usage);
/* check if (global) reference must be added to the symbol */
if ((usage & (uREAD | uWRITTEN))!=0) {

View File

@ -1770,6 +1770,12 @@ restart:
error(51); /* invalid subscript, must use [ ] */
invsubscript=TRUE;
} /* if */
if (pc_loopcond) {
/* stop counting variables that were used in loop condition,
* otherwise warnings 250 and 251 may be inaccurate */
pc_loopcond=FALSE;
pc_numloopvars=0;
} /* if */
if (invsubscript) {
if (sym!=NULL && sym->ident!=iFUNCTN)
sym->usage |= uREAD; /* avoid the "symbol is never used" warning */
@ -2177,7 +2183,6 @@ static int nesting=0;
int nargs=0; /* number of arguments */
int heapalloc=0;
int namedparams=FALSE;
int save_loopcond;
value lval = {0};
arginfo *arg;
char arglist[sMAXARGS];
@ -2197,10 +2202,12 @@ static int nesting=0;
error(29); /* invalid expression, assumed zero */
return;
} /* if */
/* make the compiler not count variables passed as function arguments
* as being used inside a loop condition */
save_loopcond=pc_loopcond;
pc_loopcond=FALSE;
if (pc_loopcond) {
/* stop counting variables that were used in loop condition,
* otherwise warnings 249 and 250 may be inaccurate */
pc_loopcond=FALSE;
pc_numloopvars=0;
} /* if */
/* check whether this is a function that returns an array */
symret=finddepend(sym);
assert(symret==NULL || symret->ident==iREFARRAY);
@ -2614,7 +2621,6 @@ static int nesting=0;
if (symret!=NULL)
popreg(sPRI); /* pop hidden parameter as function result */
pc_sideeffect=TRUE; /* assume functions carry out a side-effect */
pc_loopcond=save_loopcond;
delete_consttable(&arrayszlst); /* clear list of array sizes */
delete_consttable(&taglst); /* clear list of parameter tags */