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