Skip to content

Commit 5578eaf

Browse files
committed
sema: fix err union switch with inferred empty error sets
1 parent b758710 commit 5578eaf

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

src/Sema.zig

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)