collectgarbage()
local function errmsg(code, m)
local st, msg = load(code)
assert(not st and string.find(msg, m))
end
errmsg([[ goto l1; do ::l1:: end ]], "label 'l1'")
errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'")
errmsg([[ ::l1:: ::l1:: ]], "label 'l1'")
errmsg([[ ::l1:: do ::l1:: end]], "label 'l1'")
errmsg([[ goto l1; local aa ::l1:: ::l2:: print(3) ]], "local 'aa'")
errmsg([[
do local bb, cc; end
local aa
print(3)
]], "local 'aa'")
errmsg([[ do ::l1:: end goto l1 ]], "label 'l1'")
errmsg([[ goto l1 do ::l1:: end ]], "label 'l1'")
errmsg([[
repeat
if x then end
local xuxu = 10
until xuxu < x
]], "local 'xuxu'")
local x
do
local y = 12
x = x + 1;
x = y;
end
assert(x == 13)
do
local prog = [[
do
local a = 1
a = a + 1
a = a + 10
a = a + 2
a = a + 20
return a
end
]]
local label = string.rep("0123456789", 40)
prog = string.format(prog, label, label, label, label)
assert(assert(load(prog))() == 31)
end
do
local a = 23
x = a
;
end
while true do
local x = 45
;;;
end
assert(x == 13)
if print then
error("should not be here")
local x
;;;
else
end
local function foo()
local a = {}
a[#a + 1] = 1;
a[#a + 1] = 2;
a[#a + 1] = 3;
a[#a + 1] = 4;
a[#a + 1] = 5;
assert(a[1] == 3 and a[2] == 1 and a[3] == 2 and
a[4] == 5 and a[5] == 4)
if not a[6] then a[6] = true; end end
foo()
do local x
local y assert(y == nil)
y = true
if x == nil then
x = 1
else
x = x + 1
end
assert(x == 2 and y == true)
end
do
local first = true
local a = false
if true then
a = true
if first then
first = false
end
end
assert(a)
end
do end
local debug = require 'debug'
local function foo()
local t = {}
do
local i = 1
local a, b, c, d
t[1] = function() return a, b, c, d end
local b
do
local c
t[#t + 1] = function() return a, b, c, d end if i > 2 then end
do
local d
t[#t + 1] = function() return a, b, c, d end i = i + 1
local a
end
end
end
return t
end
local a = foo()
assert(#a == 6)
for i = 2, 6 do
assert(debug.upvalueid(a[1], 1) == debug.upvalueid(a[i], 1))
end
for i = 2, 6 do
assert(debug.upvalueid(a[1], 2) ~= debug.upvalueid(a[i], 2))
assert(debug.upvalueid(a[1], 3) ~= debug.upvalueid(a[i], 3))
end
for i = 3, 5, 2 do
assert(debug.upvalueid(a[i], 2) == debug.upvalueid(a[i - 1], 2))
assert(debug.upvalueid(a[i], 3) == debug.upvalueid(a[i - 1], 3))
assert(debug.upvalueid(a[i], 2) ~= debug.upvalueid(a[i + 1], 2))
assert(debug.upvalueid(a[i], 3) ~= debug.upvalueid(a[i + 1], 3))
end
for i = 2, 6, 2 do
assert(debug.upvalueid(a[1], 4) == debug.upvalueid(a[i], 4))
end
for i = 3, 5, 2 do
for j = 1, 6 do
assert((debug.upvalueid(a[i], 4) == debug.upvalueid(a[j], 4))
== (i == j))
end
end
local function testG(a)
if a == 1 then
error("should never be here!")
elseif a == 2 then
elseif a == 3 then
elseif a == 4 then
error("should never be here!")
a = a + 1 else
a = a * 2;
error("should never be here!")
error("should never be here!")
end
do return a end
do return "2" end
do return "3" end
return "1"
end
assert(testG(1) == "1")
assert(testG(2) == "2")
assert(testG(3) == "3")
assert(testG(4) == 5)
assert(testG(5) == 10)
do
local X
do
local a <close> = setmetatable({}, { __close = function() X = true end })
assert(X == nil)
if a then end end
assert(X == true) end
print 'OK'