mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
AstGen: Pop error trace for continue
PR #12837 handled control flow for break and return, but I forgot about `continue`. This is effectively another break, so we just need another `.restore_err_ret_index` ZIR instruction. Resolves #13618.
This commit is contained in:
parent
283c92e362
commit
3fa226a80c
2 changed files with 56 additions and 0 deletions
|
|
@ -2071,6 +2071,11 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index)
|
||||||
if (break_tag == .break_inline) {
|
if (break_tag == .break_inline) {
|
||||||
_ = try parent_gz.addUnNode(.check_comptime_control_flow, Zir.indexToRef(continue_block), node);
|
_ = try parent_gz.addUnNode(.check_comptime_control_flow, Zir.indexToRef(continue_block), node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// As our last action before the continue, "pop" the error trace if needed
|
||||||
|
if (!gen_zir.force_comptime)
|
||||||
|
_ = try parent_gz.addRestoreErrRetIndex(.{ .block = continue_block }, .always);
|
||||||
|
|
||||||
_ = try parent_gz.addBreak(break_tag, continue_block, .void_value);
|
_ = try parent_gz.addBreak(break_tag, continue_block, .void_value);
|
||||||
return Zir.Inst.Ref.unreachable_value;
|
return Zir.Inst.Ref.unreachable_value;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,57 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
cases.addCase(.{
|
||||||
|
.name = "continue in while loop",
|
||||||
|
.source =
|
||||||
|
\\fn foo() !void {
|
||||||
|
\\ return error.UhOh;
|
||||||
|
\\}
|
||||||
|
\\
|
||||||
|
\\pub fn main() !void {
|
||||||
|
\\ var i: usize = 0;
|
||||||
|
\\ while (i < 3) : (i += 1) {
|
||||||
|
\\ foo() catch continue;
|
||||||
|
\\ }
|
||||||
|
\\ return error.UnrelatedError;
|
||||||
|
\\}
|
||||||
|
,
|
||||||
|
.Debug = .{
|
||||||
|
.expect =
|
||||||
|
\\error: UnrelatedError
|
||||||
|
\\source.zig:10:5: [address] in main (test)
|
||||||
|
\\ return error.UnrelatedError;
|
||||||
|
\\ ^
|
||||||
|
\\
|
||||||
|
,
|
||||||
|
},
|
||||||
|
.ReleaseSafe = .{
|
||||||
|
.exclude_os = .{
|
||||||
|
.windows, // TODO
|
||||||
|
.linux, // defeated by aggressive inlining
|
||||||
|
},
|
||||||
|
.expect =
|
||||||
|
\\error: UnrelatedError
|
||||||
|
\\source.zig:10:5: [address] in [function]
|
||||||
|
\\ return error.UnrelatedError;
|
||||||
|
\\ ^
|
||||||
|
\\
|
||||||
|
,
|
||||||
|
},
|
||||||
|
.ReleaseFast = .{
|
||||||
|
.expect =
|
||||||
|
\\error: UnrelatedError
|
||||||
|
\\
|
||||||
|
,
|
||||||
|
},
|
||||||
|
.ReleaseSmall = .{
|
||||||
|
.expect =
|
||||||
|
\\error: UnrelatedError
|
||||||
|
\\
|
||||||
|
,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
cases.addCase(.{
|
cases.addCase(.{
|
||||||
.name = "try return + handled catch/if-else",
|
.name = "try return + handled catch/if-else",
|
||||||
.source =
|
.source =
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue