diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index 2fe3934..52bbc96 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -2359,7 +2359,10 @@ static int declloc(int fstatic) int ctag = tag; /* set to "tag" by default */ int explicit_init=FALSE;/* is the variable explicitly initialized? */ if (matchtoken('=')) { + sym->usage &= ~uDEFINE; /* temporarily mark the variable as undefined to prevent + * possible self-assignment through its initialization expression */ doexpr(FALSE,FALSE,FALSE,FALSE,&ctag,NULL,TRUE); + sym->usage |= uDEFINE; explicit_init=TRUE; } else { ldconst(0,sPRI); /* uninitialized variable, set to zero */ diff --git a/source/compiler/sc3.c b/source/compiler/sc3.c index cf9454d..993e358 100644 --- a/source/compiler/sc3.c +++ b/source/compiler/sc3.c @@ -1833,6 +1833,8 @@ static int primary(value *lval) ldconst(0,sPRI); /* load 0 */ return FALSE; /* return 0 for labels (expression error) */ } /* if */ + if ((sym->usage & uDEFINE)==0) + error_suggest(17,st,NULL,estSYMBOL,esfVARCONST); /* undefined symbol */ lval->sym=sym; lval->ident=sym->ident; lval->tag=sym->tag;