Fix more nocode_wanted jump problems

In statement expression we really mustn't emit backward jumps
under nocode_wanted (they will form infinte loops as no expressions
are evaluated).  Do-while and explicit loop with gotos weren't
handled.
This commit is contained in:
Michael Matz
2016-09-04 05:17:08 +02:00
parent f2a071e808
commit 1602998751
3 changed files with 46 additions and 4 deletions

View File

@ -5605,8 +5605,9 @@ static void block(int *bsym, int *csym, int is_expr)
skip('(');
gsym(b);
gexpr();
c = gvtst(0, 0);
gsym_addr(c, d);
c = gvtst(0, 0);
if (!nocode_wanted)
gsym_addr(c, d);
skip(')');
gsym(a);
skip(';');
@ -5678,7 +5679,10 @@ static void block(int *bsym, int *csym, int is_expr)
gexpr();
if ((vtop->type.t & VT_BTYPE) != VT_PTR)
expect("pointer");
ggoto();
if (!nocode_wanted)
ggoto();
else
vtop--;
} else if (tok >= TOK_UIDENT) {
s = label_find(tok);
/* put forward definition if needed */
@ -5689,7 +5693,9 @@ static void block(int *bsym, int *csym, int is_expr)
s->r = LABEL_FORWARD;
}
vla_sp_restore_root();
if (s->r & LABEL_FORWARD)
if (nocode_wanted)
;
else if (s->r & LABEL_FORWARD)
s->jnext = gjmp(s->jnext);
else
gjmp_addr(s->jnext);