aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorCody Tapscott <topolarity@tapscott.me>2022-09-12 23:05:50 -0700
committerCody Tapscott <topolarity@tapscott.me>2022-10-21 10:43:42 -0700
commiteda3eb1561ec9a68e692821d5de71d03e6f50d42 (patch)
tree5a3acd315089bfda58cf4366445ae8ca1916e5fd /src/codegen/llvm.zig
parent5316a00a188955d60cc38d56def51b8605181225 (diff)
downloadzig-eda3eb1561ec9a68e692821d5de71d03e6f50d42.tar.gz
zig-eda3eb1561ec9a68e692821d5de71d03e6f50d42.zip
stage2: "Pop" error trace for break/return within catch
This implement trace "popping" for correctly handled errors within `catch { ... }` and `else { ... }` blocks. When breaking from these blocks with any non-error, we pop the error trace frames corresponding to the operand. When breaking with an error, we preserve the frames so that error traces "chain" together as usual. ```zig fn foo(cond1: bool, cond2: bool) !void { bar() catch { if (cond1) { // If baz() result is a non-error, pop the error trace frames from bar() // If baz() result is an error, leave the bar() frames on the error trace return baz(); } else if (cond2) { // If we break/return an error, then leave the error frames from bar() on the error trace return error.Foo; } }; // An error returned from here does not include bar()'s error frames in the trace return error.Bar; } ``` Notice that if foo() does not return an error it, it leaves no extra frames on the error trace. This is piece (1/3) of https://github.com/ziglang/zig/issues/1923#issuecomment-1218495574
Diffstat (limited to 'src/codegen/llvm.zig')
0 files changed, 0 insertions, 0 deletions