implemented C99 for loop with variable declaration

master
Claudio Bley 2010-06-21 11:57:32 +02:00
parent 632ee5a540
commit 433ecdfc9d
1 changed files with 37 additions and 4 deletions

View File

@ -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();