mirror of
https://github.com/frida/tinycc
synced 2024-11-24 08:39:37 +03:00
implemented C99 for loop with variable declaration
This commit is contained in:
parent
632ee5a540
commit
433ecdfc9d
41
tccgen.c
41
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();
|
||||
|
Loading…
Reference in New Issue
Block a user