| ... | ... | @@ -21771,10 +21771,10 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData |
| 21771 | 21771 | // operand must be defined since it can be an invalid error value |
| 21772 | 21772 | const maybe_operand_val = try sema.resolveDefinedValue(block, operand_src, operand); |
| 21773 | 21773 | |
| 21774 | | if (disjoint: { |
| 21774 | const disjoint = disjoint: { |
| 21775 | 21775 | // Try avoiding resolving inferred error sets if we can |
| 21776 | | if (!dest_ty.isAnyError(mod) and dest_ty.errorSetNames(mod).len == 0) break :disjoint true; |
| 21777 | | if (!operand_ty.isAnyError(mod) and operand_ty.errorSetNames(mod).len == 0) break :disjoint true; |
| 21776 | if (!dest_ty.isAnyError(mod) and dest_ty.errorSetIsEmpty(mod)) break :disjoint true; |
| 21777 | if (!operand_ty.isAnyError(mod) and operand_ty.errorSetIsEmpty(mod)) break :disjoint true; |
| 21778 | 21778 | if (dest_ty.isAnyError(mod)) break :disjoint false; |
| 21779 | 21779 | if (operand_ty.isAnyError(mod)) break :disjoint false; |
| 21780 | 21780 | for (dest_ty.errorSetNames(mod)) |dest_err_name| { |
| ... | ... | @@ -21796,7 +21796,8 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData |
| 21796 | 21796 | } |
| 21797 | 21797 | |
| 21798 | 21798 | break :disjoint true; |
| 21799 | | }) { |
| 21799 | }; |
| 21800 | if (disjoint and dest_tag != .ErrorUnion) { |
| 21800 | 21801 | const msg = msg: { |
| 21801 | 21802 | const msg = try sema.errMsg( |
| 21802 | 21803 | block, |
| ... | ... | @@ -21850,10 +21851,16 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData |
| 21850 | 21851 | .int = .{ .ty = .u16_type, .storage = .{ .u64 = 0 } }, |
| 21851 | 21852 | })); |
| 21852 | 21853 | |
| 21853 | | const has_value = try block.addTyOp(.error_set_has_value, dest_ty, err_code); |
| 21854 | 21854 | const is_zero = try block.addBinOp(.cmp_eq, err_int, zero_u16); |
| 21855 | | const ok = try block.addBinOp(.bit_or, has_value, is_zero); |
| 21856 | | try sema.addSafetyCheck(block, src, ok, .invalid_error_code); |
| 21855 | if (disjoint) { |
| 21856 | // Error must be zero. |
| 21857 | try sema.addSafetyCheck(block, src, is_zero, .invalid_error_code); |
| 21858 | } else { |
| 21859 | // Error must be in destination set or zero. |
| 21860 | const has_value = try block.addTyOp(.error_set_has_value, dest_ty, err_code); |
| 21861 | const ok = try block.addBinOp(.bit_or, has_value, is_zero); |
| 21862 | try sema.addSafetyCheck(block, src, ok, .invalid_error_code); |
| 21863 | } |
| 21857 | 21864 | } else { |
| 21858 | 21865 | const err_int_inst = try block.addBitCast(Type.err_int, operand); |
| 21859 | 21866 | const ok = try block.addTyOp(.error_set_has_value, dest_ty, err_int_inst); |