aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'tccgen.c')
-rw-r--r--tccgen.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/tccgen.c b/tccgen.c
index 9d57ecd..1197ff9 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -4291,14 +4291,28 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
next();
skip(';');
} else if (tok == TOK_FOR) {
- int e;
+ int e, c99_for_decl = 0;
next();
skip('(');
if (tok != ';') {
- gexpr();
- vpop();
+ if (tok < TOK_UIDENT) {
+ // handle C99 for loop construct
+ c99_for_decl = 1;
+
+ /* record local declaration stack position */
+ s = local_stack;
+
+ decl(VT_LOCAL);
+ if (is_expr)
+ vpop();
+ } else {
+ gexpr();
+ vpop();
+ skip(';');
+ }
+ } else {
+ skip(';');
}
- skip(';');
d = ind;
c = ind;
a = 0;
@@ -4321,6 +4335,25 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
gjmp_addr(c);
gsym(a);
gsym_addr(b, c);
+
+ if (c99_for_decl) {
+ /* pop locally defined symbols */
+ if(is_expr) {
+ /* XXX: this solution makes only valgrind happy...
+ triggered by gcc.c-torture/execute/20000917-1.c */
+ Sym *p;
+ switch(vtop->type.t & VT_BTYPE) {
+ case VT_PTR:
+ case VT_STRUCT:
+ case VT_ENUM:
+ case VT_FUNC:
+ for(p=vtop->type.ref;p;p=p->prev)
+ if(p->prev==s)
+ error("unsupported expression type");
+ }
+ }
+ sym_pop(&local_stack, s);
+ }
} else
if (tok == TOK_DO) {
next();