|
@@ -3542,6 +3542,39 @@ patch = [[
|
|
|
}
|
|
|
|
|
|
|
|
|
+Bug{
|
|
|
+what = [[label between local definitions can mix-up their initializations]],
|
|
|
+report = [[Karel Tuma, 2016/03/01]],
|
|
|
+since = [[5.2]],
|
|
|
+fix = nil,
|
|
|
+example = [[
|
|
|
+do
|
|
|
+ local k = 0
|
|
|
+ local x
|
|
|
+ ::foo::
|
|
|
+ local y -- should be reset to nil after goto, but it is not
|
|
|
+ assert(not y)
|
|
|
+ y = true
|
|
|
+ k = k + 1
|
|
|
+ if k < 2 then goto foo end
|
|
|
+end
|
|
|
+]],
|
|
|
+patch = [[
|
|
|
+--- lparser.c 2015/11/02 16:09:30 2.149
|
|
|
++++ lparser.c 2016/03/03 12:03:37
|
|
|
+@@ -1226,7 +1226,7 @@
|
|
|
+ checkrepeated(fs, ll, label); /* check for repeated labels */
|
|
|
+ checknext(ls, TK_DBCOLON); /* skip double colon */
|
|
|
+ /* create new entry for this label */
|
|
|
+- l = newlabelentry(ls, ll, label, line, fs->pc);
|
|
|
++ l = newlabelentry(ls, ll, label, line, luaK_getlabel(fs));
|
|
|
+ skipnoopstat(ls); /* skip other no-op statements */
|
|
|
+ if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */
|
|
|
+ /* assume that locals are already out of scope */
|
|
|
+]]
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
--[=[
|
|
|
Bug{
|
|
|
what = [[ ]],
|