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:
grischka 2010-08-21 13:39:12 +02:00
parent 7901d1e3ad
commit 4ab4efd3a6

View File

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