---
source: src/main.rs
expression: compiled
input_file: test-data/lua5.2-tests/goto.lua
---
local fn errmsg(code, m) {
local st, msg = load(code)
assert(!st && string.find(msg, m));
}
errmsg(` goto l1; do ::l1:: end `, "label 'l1'");
errmsg(` do ::l1:: end goto l1; `, "label 'l1'");
errmsg(` ::l1:: ::l1:: `, "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
{
local y = 12
x = x + 1
x = y
}
assert(x == 13);
{
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);
}
{
}
{
local a = 23
x = a
}
while true {
local x = 45
}
assert(x == 13);
if print {
error("should not be here");
local x
} else {
}
local fn 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 && a[(2)] == 1 && a[(3)] == 2 && a[(4)] == 5 && a[(5)] == 4);
if !a[(6)] {
a[(6)] = true
}
}
foo();
local fn foo() {
local a = {}
{
local i = 1
local k = 0
a[(0)] = fn (y) {
k = y
}
{
local x
if i > 2 {
}
a[(i)] = fn (y) {
if y {
x = y
} else {
return x + k
}
}
i = i + 1
}
}
return a
}
local a = foo()
a[(1)](10);
a[(2)](20);
assert(a[(1)]() == 10 && a[(2)]() == 20 && a[(3)] == nil);
a[(0)](13);
assert(a[(1)]() == 23 && a[(2)]() == 33);
local fn testG(a) {
if a == 1 {
error("should never be here!");
} elseif if a == 2 {
} elseif if a == 3 {
} elseif if a == 4 {
error("should never be here!");
a = a + 1
} else {
a = a * 2
error("should never be here!");
error("should never be here!");
}
{
return a
}
{
return "2"
}
{
return "3"
}
return "1"
}
assert(testG(1) == "1");
assert(testG(2) == "2");
assert(testG(3) == "3");
assert(testG(4) == 5);
assert(testG(5) == 10);
print('OK');