mirror of
https://github.com/frida/tinycc
synced 2024-11-28 02:29:38 +03:00
Revert "implemented C99 for loop with variable declaration"
This reverts commit 433ecdfc9d
.
The patch breaks e.g. with
for ((i = 10); --i;);
In particular to check for a type decl. this is not sufficient:
if (tok < TOK_UIDENT) {
A future approach to c99 loop variables might instead use:
if (parse_btype(...)) {
plus refactor function decl() accordingly.
This commit is contained in:
parent
7901d1e3ad
commit
4ab4efd3a6
41
tccgen.c
41
tccgen.c
@ -4291,28 +4291,14 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
|
||||
next();
|
||||
skip(';');
|
||||
} else if (tok == TOK_FOR) {
|
||||
int e, c99_for_decl = 0;
|
||||
int e;
|
||||
next();
|
||||
skip('(');
|
||||
if (tok != ';') {
|
||||
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(';');
|
||||
gexpr();
|
||||
vpop();
|
||||
}
|
||||
skip(';');
|
||||
d = ind;
|
||||
c = ind;
|
||||
a = 0;
|
||||
@ -4335,25 +4321,6 @@ 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