fix catch handlers / match statements yielding past scope

This commit is contained in:
2026-06-30 23:21:47 +02:00
parent d6f9c24314
commit 7fe3552c01
6 changed files with 117 additions and 44 deletions
+25 -19
View File
@@ -59,33 +59,36 @@ via_widen func(value i32) i32 ! BasicOrDetail {
catch_basic func(value i32) i32 {
return maybe(value) catch |e| {
if (e == .bad) {
result i32 :: if (e == .bad) {
yield 21
} else {
yield 22
}
yield result
}
}
catch_detail func(value i32) i32 {
return with_detail(value) catch |e| {
match e {
.code |n|: yield n + 30
.info |info|: yield info.code + info.extra + 30
.empty: yield 40
result i32 :: match e {
.code |n|: n + 30
.info |info|: info.code + info.extra + 30
.empty: 40
}
yield result
}
}
catch_widen func(value i32) i32 {
return via_widen(value) catch |e| {
match e {
.bad: yield 50
.worse: yield 51
.code |n|: yield n
.info |info|: yield info.code + info.extra
.empty: yield 52
result i32 :: match e {
.bad: 50
.worse: 51
.code |n|: n
.info |info|: info.code + info.extra
.empty: 52
}
yield result
}
}
@@ -138,24 +141,27 @@ main func() i32 {
l :: catch_widen(0)
m :: catch_widen(-1)
n :: inline_enum(0) catch |e| {
if (e == .inline_bad) {
result i32 :: if (e == .inline_bad) {
yield 60
} else {
yield 61
}
yield result
}
o :: inline_detail(0) catch |e| {
match e {
.inline_code |value|: yield value + 70
.inline_empty: yield 80
result i32 :: match e {
.inline_code |value|: value + 70
.inline_empty: 80
}
yield result
}
p :: with_detail(3) catch |e| {
match e {
.code |value|: yield value
.info |info|: yield info.code + info.extra
.empty: yield 0
result i32 :: match e {
.code |value|: value
.info |info|: info.code + info.extra
.empty: 0
}
yield result
}
acc = acc + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p