Correctly report out-of-scope gotos

Bug was in `fscope_exit`: if a loop contains a break
`gola_fixup` will not be called leaving unresolved labels
undetected.  This cannot cause problems for valid code because
`parse_label` calls `gola_resolve` on each newly parsed label.

Fixes #228.
This commit is contained in:
Demi Obenour 2017-03-06 13:12:03 -05:00
parent a25c0b99b8
commit 596439f6e8

View File

@ -1282,12 +1282,15 @@ static void fscope_end(FuncState *fs)
MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc); MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);
ls->vtop = idx; /* Drop break label immediately. */ ls->vtop = idx; /* Drop break label immediately. */
gola_resolve(ls, bl, idx); gola_resolve(ls, bl, idx);
} else {
/* need the fixup step to propagate the breaks. */
gola_fixup(ls, bl);
return; return;
} /* else: need the fixup step to propagate the breaks. */ }
} else if (!(bl->flags & FSCOPE_GOLA)) { }
return; if ((bl->flags & FSCOPE_GOLA)) {
gola_fixup(ls, bl);
} }
gola_fixup(ls, bl);
} }
/* Mark scope as having an upvalue. */ /* Mark scope as having an upvalue. */