From adcaad6d91c309fab20ea208231c3e7d33fcc21f Mon Sep 17 00:00:00 2001 From: dweiller <4678790+dweiller@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:41:28 +1100 Subject: [PATCH] sema: fix err union switch with inferred empty error sets --- src/Sema.zig | 53 ++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 752bc4da6f..eebf31a238 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -11237,30 +11237,6 @@ fn zirSwitchBlockErrUnion(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Comp const operand_ty = sema.typeOf(raw_operand_val); const operand_err_set_ty = operand_ty.errorUnionSet(mod); - const else_error_ty: ?Type = try validateErrSetSwitch( - sema, - block, - &seen_errors, - &case_vals, - operand_err_set_ty, - inst_data, - scalar_cases_len, - multi_cases_len, - .{ .body = else_case.body, .end = else_case.end, .src = else_prong_src }, - extra.data.bits.has_else, - ); - - var spa: SwitchProngAnalysis = .{ - .sema = sema, - .parent_block = block, - .operand = undefined, // must be set to the unwrapped error code before use - .operand_ptr = .none, - .cond = raw_operand_val, - .else_error_ty = else_error_ty, - .switch_block_inst = inst, - .tag_capture_inst = undefined, - }; - const block_inst: Air.Inst.Index = @enumFromInt(sema.air_instructions.len); try sema.air_instructions.append(gpa, .{ .tag = .block, @@ -11298,6 +11274,35 @@ fn zirSwitchBlockErrUnion(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Comp defer child_block.instructions.deinit(gpa); defer merges.deinit(gpa); + const resolved_err_set = try sema.resolveInferredErrorSetTy(block, src, operand_err_set_ty.toIntern()); + if (Type.fromInterned(resolved_err_set).errorSetIsEmpty(mod)) { + return sema.resolveBlockBody(block, operand_src, &child_block, non_error_case.body, inst, merges); + } + + const else_error_ty: ?Type = try validateErrSetSwitch( + sema, + block, + &seen_errors, + &case_vals, + operand_err_set_ty, + inst_data, + scalar_cases_len, + multi_cases_len, + .{ .body = else_case.body, .end = else_case.end, .src = else_prong_src }, + extra.data.bits.has_else, + ); + + var spa: SwitchProngAnalysis = .{ + .sema = sema, + .parent_block = block, + .operand = undefined, // must be set to the unwrapped error code before use + .operand_ptr = .none, + .cond = raw_operand_val, + .else_error_ty = else_error_ty, + .switch_block_inst = inst, + .tag_capture_inst = undefined, + }; + if (try sema.resolveDefinedValue(&child_block, src, raw_operand_val)) |operand_val| { if (operand_val.errorUnionIsPayload(mod)) { return sema.resolveBlockBody(block, operand_src, &child_block, non_error_case.body, inst, merges);