authorgravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2024-01-18 01:41:14+11:00
committergravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2024-01-18 04:47:31+11:00
log7ef3d3876a7a4dfa4c3d2692fab6b4102d6d7480
treebc24ddf1bf60a3df3c9b172e3be788b4118acb92
parentec358d6db5a10989590e11bbbbd3bed9f81cf1f4

astgen: fix error return trace on error union switch


2 files changed, 17 insertions(+), 0 deletions(-)

src/AstGen.zig+16
......@@ -6919,6 +6919,8 @@ fn switchExprErrUnion(
69196919 };
69206920 assert(node_tags[switch_node] == .@"switch" or node_tags[switch_node] == .switch_comma);
69216921
6922 const do_err_trace = astgen.fn_block != null;
6923
69226924 const extra = tree.extraData(node_datas[switch_node].rhs, Ast.Node.SubRange);
69236925 const case_nodes = tree.extra_data[extra.start..extra.end];
69246926
......@@ -7304,10 +7306,14 @@ fn switchExprErrUnion(
73047306 case_scope.instructions_top = parent_gz.instructions.items.len;
73057307 defer case_scope.unstack();
73067308
7309 if (do_err_trace and nodeMayAppendToErrorTrace(tree, operand_node))
7310 _ = try case_scope.addSaveErrRetIndex(.always);
7311
73077312 try case_scope.addDbgBlockBegin();
73087313 if (dbg_var_name != .empty) {
73097314 try case_scope.addDbgVar(.dbg_var_val, dbg_var_name, dbg_var_inst);
73107315 }
7316
73117317 const target_expr_node = case.ast.target_expr;
73127318 const case_result = try expr(&case_scope, sub_scope, block_scope.break_result_info, target_expr_node);
73137319 // check capture_scope, not err_scope to avoid false positive unused error capture
......@@ -7318,7 +7324,17 @@ fn switchExprErrUnion(
73187324 any_uses_err_capture = true;
73197325 }
73207326 try case_scope.addDbgBlockEnd();
7327
73217328 if (!parent_gz.refIsNoReturn(case_result)) {
7329 if (do_err_trace)
7330 try restoreErrRetIndex(
7331 &case_scope,
7332 .{ .block = switch_block },
7333 block_scope.break_result_info,
7334 target_expr_node,
7335 case_result,
7336 );
7337
73227338 _ = try case_scope.addBreakWithSrcNode(.@"break", switch_block, case_result, target_expr_node);
73237339 }
73247340
src/Sema.zig+1
......@@ -13109,6 +13109,7 @@ fn validateErrSetSwitch(
1310913109 .defer_err_code,
1311013110 .err_union_code,
1311113111 .ret_err_value_code,
13112 .save_err_ret_index,
1311213113 .restore_err_ret_index,
1311313114 .is_non_err,
1311413115 .ret_is_non_err,