Fix tagof operator used as a default value for function arguments

This commit is contained in:
Arkshine 2015-01-30 23:34:04 +01:00
parent 6319331a33
commit b0543a111d

View File

@ -1243,6 +1243,7 @@ static int hier2(value *lval)
clear_value(lval); clear_value(lval);
lval->ident=iCONSTEXPR; lval->ident=iCONSTEXPR;
lval->constval= val; lval->constval= val;
lval->tag=pc_addtag("bool");
ldconst(lval->constval,sPRI); ldconst(lval->constval,sPRI);
while (paranthese--) while (paranthese--)
needtoken(')'); needtoken(')');
@ -1335,7 +1336,7 @@ static int hier2(value *lval)
exporttag(tag); exporttag(tag);
clear_value(lval); clear_value(lval);
lval->ident=iCONSTEXPR; lval->ident=iCONSTEXPR;
lval->constval=tag; lval->constval=tag | PUBLICTAG;
ldconst(lval->constval,sPRI); ldconst(lval->constval,sPRI);
while (paranthese--) while (paranthese--)
needtoken(')'); needtoken(')');
@ -1852,6 +1853,7 @@ static int nesting=0;
arginfo *arg; arginfo *arg;
char arglist[sMAXARGS]; char arglist[sMAXARGS];
constvalue arrayszlst = { NULL, "", 0, 0}; /* array size list starts empty */ constvalue arrayszlst = { NULL, "", 0, 0}; /* array size list starts empty */
constvalue taglst = { NULL, "", 0, 0}; /* tag list starts empty */
symbol *symret; symbol *symret;
cell lexval; cell lexval;
char *lexstr; char *lexstr;
@ -2001,6 +2003,8 @@ static int nesting=0;
markusage(lval.sym,uWRITTEN); markusage(lval.sym,uWRITTEN);
if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag)) if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag))
error(213); error(213);
if (lval.tag != 0)
append_constval(&taglst, arg[argidx].name, lval.tag, 0);
break; break;
case iVARIABLE: case iVARIABLE:
if (lval.ident==iLABEL || lval.ident==iFUNCTN || lval.ident==iREFFUNC if (lval.ident==iLABEL || lval.ident==iFUNCTN || lval.ident==iREFFUNC
@ -2013,6 +2017,8 @@ static int nesting=0;
check_userop(NULL,lval.tag,arg[argidx].tags[0],2,NULL,&lval.tag); check_userop(NULL,lval.tag,arg[argidx].tags[0],2,NULL,&lval.tag);
if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag)) if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag))
error(213); error(213);
if (lval.tag != 0)
append_constval(&taglst, arg[argidx].name, lval.tag, 0);
argidx++; /* argument done */ argidx++; /* argument done */
break; break;
case iREFERENCE: case iREFERENCE:
@ -2033,6 +2039,8 @@ static int nesting=0;
/* otherwise, the address is already in PRI */ /* otherwise, the address is already in PRI */
if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag)) if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag))
error(213); error(213);
if (lval.tag != 0)
append_constval(&taglst, arg[argidx].name, lval.tag, 0);
argidx++; /* argument done */ argidx++; /* argument done */
if (lval.sym!=NULL) if (lval.sym!=NULL)
markusage(lval.sym,uWRITTEN); markusage(lval.sym,uWRITTEN);
@ -2108,6 +2116,8 @@ static int nesting=0;
/* address already in PRI */ /* address already in PRI */
if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag)) if (!checktag(arg[argidx].tags,arg[argidx].numtags,lval.tag))
error(213); error(213);
if (lval.tag != 0)
append_constval(&taglst, arg[argidx].name, lval.tag, 0);
// ??? set uWRITTEN? // ??? set uWRITTEN?
argidx++; /* argument done */ argidx++; /* argument done */
break; break;
@ -2215,13 +2225,14 @@ static int nesting=0;
array_sz=1; array_sz=1;
} /* if */ } /* if */
} else { } else {
symbol *sym; asz=find_constval(&taglst,arg[argidx].defvalue.size.symname,
assert((arg[argidx].hasdefault & uTAGOF)!=0); arg[argidx].defvalue.size.level);
sym=findloc(arg[argidx].defvalue.size.symname); if (asz != NULL) {
if (sym==NULL) exporttag(asz->value);
sym=findglb(arg[argidx].defvalue.size.symname); array_sz=asz->value | PUBLICTAG; /* must be set, because it just was exported */
array_sz=(sym!=NULL) ? sym->tag : 0; } else {
exporttag((int)array_sz); array_sz=0;
} /* if */
} /* if */ } /* if */
ldconst(array_sz,sPRI); ldconst(array_sz,sPRI);
pushreg(sPRI); /* store the function argument on the stack */ pushreg(sPRI); /* store the function argument on the stack */
@ -2245,6 +2256,7 @@ static int nesting=0;
sideeffect=TRUE; /* assume functions carry out a side-effect */ sideeffect=TRUE; /* assume functions carry out a side-effect */
sc_allowproccall=FALSE; sc_allowproccall=FALSE;
delete_consttable(&arrayszlst); /* clear list of array sizes */ delete_consttable(&arrayszlst); /* clear list of array sizes */
delete_consttable(&taglst); /* clear list of parameter tags */
/* maintain max. amount of memory used */ /* maintain max. amount of memory used */
{ {
@ -2381,7 +2393,8 @@ static int constant(value *lval)
error(213); /* tagname mismatch */ error(213); /* tagname mismatch */
litadd(item); /* store expression result in literal table */ litadd(item); /* store expression result in literal table */
} while (matchtoken(',')); } while (matchtoken(','));
needtoken('}'); if (!needtoken('}'))
lexclr(FALSE);
ldconst((val+glb_declared)*sizeof(cell),sPRI); ldconst((val+glb_declared)*sizeof(cell),sPRI);
lval->ident=iARRAY; /* pretend this is a global array */ lval->ident=iARRAY; /* pretend this is a global array */
lval->constval=litidx-val; /* constval == the size of the literal array */ lval->constval=litidx-val; /* constval == the size of the literal array */