aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'tccgen.c')
-rw-r--r--tccgen.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/tccgen.c b/tccgen.c
index 88b8c72..8c1165f 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -3480,7 +3480,7 @@ static void post_type(CType *type, AttributeDef *ad)
vla_runtime_type_size(type, &align);
gen_op('*');
- vset(&int_type, VT_LOCAL|VT_LVAL, loc);
+ vset(&int_type, VT_LOCAL|VT_LVAL, n);
vswap();
vstore();
}
@@ -4809,7 +4809,7 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
gsym_addr(b, d);
} else if (tok == '{') {
Sym *llabel;
- int block_vla_sp_loc, *saved_vla_sp_loc, saved_vla_flags;
+ int block_vla_sp_loc, *saved_vla_sp_loc, saved_vla_flags, *orig_vla_sp_loc;
next();
/* record local declaration stack position */
@@ -4822,7 +4822,8 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
/* save VLA state */
block_vla_sp_loc = *(saved_vla_sp_loc = vla_sp_loc);
if (saved_vla_sp_loc != &vla_sp_root_loc)
- vla_sp_loc = &block_vla_sp_loc;
+ vla_sp_loc = &block_vla_sp_loc;
+ orig_vla_sp_loc = vla_sp_loc;
saved_vla_flags = vla_flags;
vla_flags |= VLA_NEED_NEW_FRAME;
@@ -4878,10 +4879,10 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
/* Pop VLA frames and restore stack pointer if required */
if (saved_vla_sp_loc != &vla_sp_root_loc)
*saved_vla_sp_loc = block_vla_sp_loc;
- if (vla_sp_loc != (saved_vla_sp_loc == &vla_sp_root_loc ? &vla_sp_root_loc : &block_vla_sp_loc)) {
- vla_sp_loc = saved_vla_sp_loc;
- gen_vla_sp_restore(*vla_sp_loc);
+ if (vla_sp_loc != orig_vla_sp_loc) {
+ gen_vla_sp_restore(*saved_vla_sp_loc);
}
+ vla_sp_loc = saved_vla_sp_loc;
vla_flags = (vla_flags & ~VLA_SCOPE_FLAGS) | (saved_vla_flags & VLA_SCOPE_FLAGS);
next();
@@ -5482,6 +5483,8 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c,
vla_runtime_type_size(type, &a);
gen_vla_alloc(type, a);
+ vla_flags = VLA_IN_SCOPE;
+ vla_sp_save();
vset(type, VT_LOCAL|VT_LVAL, c);
vswap();
vstore();