mirror of
https://github.com/ziglang/zig.git
synced 2025-12-25 15:43:06 +00:00
sema: fix err union switch with inferred empty error sets
This commit is contained in:
parent
2fa69cce72
commit
adcaad6d91
53
src/Sema.zig
53
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user