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();
|
next();
|
||||||
skip(';');
|
skip(';');
|
||||||
} else if (tok == TOK_FOR) {
|
} else if (tok == TOK_FOR) {
|
||||||
int e;
|
int e, c99_for_decl = 0;
|
||||||
next();
|
next();
|
||||||
skip('(');
|
skip('(');
|
||||||
if (tok != ';') {
|
if (tok != ';') {
|
||||||
gexpr();
|
if (tok < TOK_UIDENT) {
|
||||||
vpop();
|
// 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;
|
d = ind;
|
||||||
c = ind;
|
c = ind;
|
||||||
a = 0;
|
a = 0;
|
||||||
@ -4321,6 +4335,25 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
|
|||||||
gjmp_addr(c);
|
gjmp_addr(c);
|
||||||
gsym(a);
|
gsym(a);
|
||||||
gsym_addr(b, c);
|
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
|
} else
|
||||||
if (tok == TOK_DO) {
|
if (tok == TOK_DO) {
|
||||||
next();
|
next();
|
||||||
|
Loading…
Reference in New Issue
Block a user