errdefer and try/defer fix
This commit is contained in:
@@ -91,6 +91,36 @@ use_try func() i32 ! Error {
|
||||
return value + 1
|
||||
}
|
||||
|
||||
ct_errdefer func(fail bool) i32 ! Error {
|
||||
trace i32 = 0
|
||||
defer trace = trace * 10 + 1
|
||||
errdefer |err| {
|
||||
if (err == .bad) trace = trace * 10 + 2
|
||||
}
|
||||
defer trace = trace * 10 + 3
|
||||
if (fail) return .bad
|
||||
return 7
|
||||
}
|
||||
|
||||
ct_try_errdefer func() i32 ! Error {
|
||||
trace i32 = 0
|
||||
defer trace = trace * 10 + 4
|
||||
errdefer |err| {
|
||||
if (err == .bad) trace = trace * 10 + 5
|
||||
}
|
||||
return try may_fail(true)
|
||||
}
|
||||
|
||||
ct_errdefer_check func() i32 {
|
||||
ok i32 :: ct_errdefer(false) catch 0
|
||||
if (ok != 7) return 1
|
||||
explicit_error i32 :: ct_errdefer(true) catch 9
|
||||
if (explicit_error != 9) return 2
|
||||
try_error i32 :: ct_try_errdefer() catch 9
|
||||
if (try_error != 9) return 3
|
||||
return 42
|
||||
}
|
||||
|
||||
recover func() i32 {
|
||||
return may_fail(true) catch |e| {
|
||||
match e {
|
||||
@@ -135,6 +165,7 @@ storage_mutation func() i32 {
|
||||
}
|
||||
|
||||
GLOBAL :: $sum_loop(4)
|
||||
ERRDEFER :: $ct_errdefer_check()
|
||||
|
||||
main func() i32 {
|
||||
point Point :: $make_point()
|
||||
@@ -205,5 +236,8 @@ main func() i32 {
|
||||
if fallible_err != 13 {
|
||||
return 16
|
||||
}
|
||||
if ERRDEFER != 42 {
|
||||
return 17
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user