aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-01-18 18:32:52 -0800
committerGitHub <noreply@github.com>2024-01-18 18:32:52 -0800
commit6ecf3b1ef35d1ce8a89a20ecead244a2c37269c6 (patch)
treec8859e64c52e379f8f2940187fd2c22a765be829 /src
parent7d81c952d57a76454c31b13b3ec8e21388f02171 (diff)
parentc4cff443b81b81711c8ed7367f05fe7fdffe8239 (diff)
downloadzig-6ecf3b1ef35d1ce8a89a20ecead244a2c37269c6.tar.gz
zig-6ecf3b1ef35d1ce8a89a20ecead244a2c37269c6.zip
Merge pull request #18599 from dweiller/err-union-switch-err-trace
astgen: fix error return trace on error union switch
Diffstat (limited to 'src')
-rw-r--r--src/AstGen.zig16
-rw-r--r--src/Sema.zig1
2 files changed, 17 insertions, 0 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig
index ad7cb813ef..b613a6b677 100644
--- a/src/AstGen.zig
+++ b/src/AstGen.zig
@@ -6919,6 +6919,8 @@ fn switchExprErrUnion(
};
assert(node_tags[switch_node] == .@"switch" or node_tags[switch_node] == .switch_comma);
+ const do_err_trace = astgen.fn_block != null;
+
const extra = tree.extraData(node_datas[switch_node].rhs, Ast.Node.SubRange);
const case_nodes = tree.extra_data[extra.start..extra.end];
@@ -7304,10 +7306,14 @@ fn switchExprErrUnion(
case_scope.instructions_top = parent_gz.instructions.items.len;
defer case_scope.unstack();
+ if (do_err_trace and nodeMayAppendToErrorTrace(tree, operand_node))
+ _ = try case_scope.addSaveErrRetIndex(.always);
+
try case_scope.addDbgBlockBegin();
if (dbg_var_name != .empty) {
try case_scope.addDbgVar(.dbg_var_val, dbg_var_name, dbg_var_inst);
}
+
const target_expr_node = case.ast.target_expr;
const case_result = try expr(&case_scope, sub_scope, block_scope.break_result_info, target_expr_node);
// check capture_scope, not err_scope to avoid false positive unused error capture
@@ -7318,7 +7324,17 @@ fn switchExprErrUnion(
any_uses_err_capture = true;
}
try case_scope.addDbgBlockEnd();
+
if (!parent_gz.refIsNoReturn(case_result)) {
+ if (do_err_trace)
+ try restoreErrRetIndex(
+ &case_scope,
+ .{ .block = switch_block },
+ block_scope.break_result_info,
+ target_expr_node,
+ case_result,
+ );
+
_ = try case_scope.addBreakWithSrcNode(.@"break", switch_block, case_result, target_expr_node);
}
diff --git a/src/Sema.zig b/src/Sema.zig
index 89a5ba0920..dfb71e08b1 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -13117,6 +13117,7 @@ fn validateErrSetSwitch(
.defer_err_code,
.err_union_code,
.ret_err_value_code,
+ .save_err_ret_index,
.restore_err_ret_index,
.is_non_err,
.ret_is_non_err,