From 39828f23f2967e78a2f0f981cbfa81e777adbef7 Mon Sep 17 00:00:00 2001 From: Zeex Date: Fri, 19 Jun 2015 21:38:05 +0600 Subject: [PATCH] Fix error when static/stock/public constant used as array size Fixes #70 --------- test code -------- native printf(const format[], ...); static const a = 1; static stock const b = 2; stock const c = 3; public const d = 4; main() { static const e = 5; new aa[a]; new ab[b]; new ac[c]; new ad[d]; new ae[e]; printf("%d", sizeof(aa), aa); printf("%d", sizeof(ab), ab); printf("%d", sizeof(ac), ac); printf("%d", sizeof(ad), ad); printf("%d", sizeof(ae), ae); } ----- end of test code ----- --- source/compiler/sc1.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index de6496e..3406fb0 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -1860,8 +1860,13 @@ static void declfuncvar(int fpublic,int fstatic,int fstock,int fconst) /* only variables can be "const" or both "public" and "stock" */ invalidfunc= fconst || (fpublic && fstock); if (invalidfunc || !newfunc(name,tag,fpublic,fstatic,fstock)) { - /* if not a function, try a global variable */ - declglb(name,tag,fpublic,fstatic,fstock,fconst); + /* if not a function, try a global constant/variable */ + if (fconst) { + lexpush(); + decl_const(sGLOBAL); + } else { + declglb(name,tag,fpublic,fstatic,fstock,fconst); + } /* if */ } /* if */ } /* if */ } @@ -4948,8 +4953,14 @@ static void statement(int *lastindent,int allow_decl) break; case tSTATIC: if (allow_decl) { - declloc(TRUE); - lastst=tNEW; + tok=lex(&val,&st); + if (tok==tCONST) { + decl_const(sSTATIC); + } else { + lexpush(); + declloc(TRUE); + lastst=tNEW; + } /* if */ } else { error(3); /* declaration only valid in a block */ } /* if */