1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
# This file is a part of Julia. License is MIT: https://julialang.org/license
# Basic goto tests
function goto_test1()
@goto a
return false
@label a
return true
end
@test goto_test1()
@test eval(:(@label a)) === nothing
@test Expr(:error, "label \"a\" referenced but not defined") ==
Meta.lower(@__MODULE__, :(@goto a))
@test Expr(:error, "label \"a\" defined multiple times") ==
Meta.lower(@__MODULE__, quote
function goto_test2()
@goto a
@label a
@label a
return
end
end)
@test Expr(:error, "label \"a\" referenced but not defined") ==
Meta.lower(@__MODULE__, quote
function goto_test3()
@goto a
return
end
end)
@test Expr(:error, "misplaced label") ==
Meta.lower(@__MODULE__, quote
function goto_test4()
@goto a
try
@label a
catch
end
end
end)
# test that labels in macros are reassigned if unescaped
macro goto_test5_macro1()
return :(@label a)
end
macro goto_test5_macro2()
return :(@goto a)
end
macro goto_test5_macro3()
return esc(:(@label a))
end
@test Expr(:error, "label \"a\" referenced but not defined") ==
Meta.lower(@__MODULE__, quote
function goto_test5_1()
@goto a
@goto_test5_macro1
return
end
end)
let e = Meta.lower(@__MODULE__, quote
function goto_test5_2()
@goto_test5_macro2
@label a
return
end
end)
@test (e::Expr).head === :error
@test occursin(r"label \"#\d+#a\" referenced but not defined", e.args[1])
end
function goto_test5_3()
@goto a
return false
@goto_test5_macro3
return true
end
@test goto_test5_3()
@test Expr(:error, "goto from a try/finally block is not permitted") ==
Meta.lower(@__MODULE__, quote
function goto_test6()
try
@goto a
finally
end
@label a
return
end
end)
function goto_test6()
@goto a
@label a
end
@test goto_test6() === nothing
function goto_test7(x)
@label a
if x
@goto a
end
end
@test goto_test7(false) === nothing
module GotoMacroTest
macro goto_test8_macro()
quote
function $(esc(:goto_test8))()
@label a
@goto a
end
end
end
end
GotoMacroTest.@goto_test8_macro
# issue #15600
function t0_15600(flag)
flag && @goto return2
return 1
@label return2
return 2
end
@test t0_15600(true) == 2
@test t0_15600(false) == 1
function t1_15600(flag)
flag || @goto return2
return 1
@label return2
return 2
end
@test t1_15600(true) == 1
@test t1_15600(false) == 2
# issue #15561
function f15561()
a = @goto crater
@label crater
end
@test f15561() === nothing
# issue #28077
function foo28077()
s = 0
i = 0
@label L
i += 1
s += i
if i < 10
@goto L
end
return s
end
@test foo28077() == 55
|