mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-13 05:10:07 +08:00
Reject jumping inside stmtexprs
One can't jump into statement expressions from outside them, like the following: int i = ({ label: foo(); 42; }); goto label; We reject this by making the labels simply not available outside (GCC has a nicer error message about jumping into a statement expression).
This commit is contained in:
parent
1602998751
commit
892c3d996f
8
tccgen.c
8
tccgen.c
@ -5406,7 +5406,7 @@ static void block(int *bsym, int *csym, int is_expr)
|
||||
gsym(a);
|
||||
gsym_addr(b, d);
|
||||
} else if (tok == '{') {
|
||||
Sym *llabel;
|
||||
Sym *llabel, *glabel;
|
||||
int block_vla_sp_loc = vla_sp_loc, saved_vlas_in_scope = vlas_in_scope;
|
||||
|
||||
next();
|
||||
@ -5414,6 +5414,10 @@ static void block(int *bsym, int *csym, int is_expr)
|
||||
s = local_stack;
|
||||
llabel = local_label_stack;
|
||||
++local_scope;
|
||||
/* Labels defined inside statement expressions aren't
|
||||
available from the outside, so record that as well. */
|
||||
if (is_expr)
|
||||
glabel = global_label_stack;
|
||||
|
||||
/* handle local labels declarations */
|
||||
if (tok == TOK_LABEL) {
|
||||
@ -5439,6 +5443,8 @@ static void block(int *bsym, int *csym, int is_expr)
|
||||
block(bsym, csym, is_expr);
|
||||
}
|
||||
}
|
||||
if (is_expr)
|
||||
label_pop(&global_label_stack, glabel);
|
||||
/* pop locally defined labels */
|
||||
label_pop(&local_label_stack, llabel);
|
||||
/* pop locally defined symbols */
|
||||
|
Loading…
Reference in New Issue
Block a user