@@ -11212,30 +11212,6 @@ fn zirSwitchBlockErrUnion(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Comp
1121211212 const operand_ty = sema.typeOf(raw_operand_val);
1121311213 const operand_err_set_ty = operand_ty.errorUnionSet(mod);
1121411214
11215- const else_error_ty: ?Type = try validateErrSetSwitch(
11216- sema,
11217- block,
11218- &seen_errors,
11219- &case_vals,
11220- operand_err_set_ty,
11221- inst_data,
11222- scalar_cases_len,
11223- multi_cases_len,
11224- .{ .body = else_case.body, .end = else_case.end, .src = else_prong_src },
11225- extra.data.bits.has_else,
11226- );
11227-
11228- var spa: SwitchProngAnalysis = .{
11229- .sema = sema,
11230- .parent_block = block,
11231- .operand = undefined, // must be set to the unwrapped error code before use
11232- .operand_ptr = .none,
11233- .cond = raw_operand_val,
11234- .else_error_ty = else_error_ty,
11235- .switch_block_inst = inst,
11236- .tag_capture_inst = undefined,
11237- };
11238-
1123911215 const block_inst: Air.Inst.Index = @intCast(sema.air_instructions.len);
1124011216 try sema.air_instructions.append(gpa, .{
1124111217 .tag = .block,
@@ -11273,6 +11249,36 @@ fn zirSwitchBlockErrUnion(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Comp
1127311249 defer child_block.instructions.deinit(gpa);
1127411250 defer merges.deinit(gpa);
1127511251
11252+
11253+ const resolved_err_set = try sema.resolveInferredErrorSetTy(block, src, operand_err_set_ty.toIntern());
11254+ if (Type.fromInterned(resolved_err_set).errorSetIsEmpty(mod)) {
11255+ return sema.resolveBlockBody(block, operand_src, &child_block, non_error_case.body, inst, merges);
11256+ }
11257+
11258+ const else_error_ty: ?Type = try validateErrSetSwitch(
11259+ sema,
11260+ block,
11261+ &seen_errors,
11262+ &case_vals,
11263+ operand_err_set_ty,
11264+ inst_data,
11265+ scalar_cases_len,
11266+ multi_cases_len,
11267+ .{ .body = else_case.body, .end = else_case.end, .src = else_prong_src },
11268+ extra.data.bits.has_else,
11269+ );
11270+
11271+ var spa: SwitchProngAnalysis = .{
11272+ .sema = sema,
11273+ .parent_block = block,
11274+ .operand = undefined, // must be set to the unwrapped error code before use
11275+ .operand_ptr = .none,
11276+ .cond = raw_operand_val,
11277+ .else_error_ty = else_error_ty,
11278+ .switch_block_inst = inst,
11279+ .tag_capture_inst = undefined,
11280+ };
11281+
1127611282 if (try sema.resolveDefinedValue(&child_block, src, raw_operand_val)) |operand_val| {
1127711283 if (operand_val.errorUnionIsPayload(mod)) {
1127811284 return sema.resolveBlockBody(block, operand_src, &child_block, non_error_case.body, inst, merges);
0 commit comments