Commit adcaad6d91

dweiller <4678790+dweiller@users.noreply.github.com>
2023-12-01 05:41:28
sema: fix err union switch with inferred empty error sets
1 parent 2fa69cc
Changed files (1)
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);