| ... | @@ -11877,6 +11877,45 @@ fn analyzeArithmetic( | ... | @@ -11877,6 +11877,45 @@ fn analyzeArithmetic( |
| 11877 | return sema.tupleFieldValByIndex(block, src, op_ov, 0, op_ov_tuple_ty); | 11877 | return sema.tupleFieldValByIndex(block, src, op_ov, 0, op_ov_tuple_ty); |
| 11878 | } | 11878 | } |
| 11879 | } | 11879 | } |
| | 11880 | switch (rs.air_tag) { |
| | 11881 | .div_float, .div_exact, .div_trunc, .div_floor => { |
| | 11882 | const ok = if (resolved_type.zigTypeTag() == .Vector) ok: { |
| | 11883 | const zero_val = try Value.Tag.repeated.create(sema.arena, Value.zero); |
| | 11884 | const zero = try sema.addConstant(sema.typeOf(casted_rhs), zero_val); |
| | 11885 | const ok = try block.addCmpVector(casted_rhs, zero, .neq, try sema.addType(resolved_type)); |
| | 11886 | break :ok try block.addInst(.{ |
| | 11887 | .tag = .reduce, |
| | 11888 | .data = .{ .reduce = .{ |
| | 11889 | .operand = ok, |
| | 11890 | .operation = .And, |
| | 11891 | } }, |
| | 11892 | }); |
| | 11893 | } else ok: { |
| | 11894 | const zero = try sema.addConstant(sema.typeOf(casted_rhs), Value.zero); |
| | 11895 | break :ok try block.addBinOp(.cmp_neq, casted_rhs, zero); |
| | 11896 | }; |
| | 11897 | try sema.addSafetyCheck(block, ok, .divide_by_zero); |
| | 11898 | }, |
| | 11899 | .rem, .mod => { |
| | 11900 | const ok = if (resolved_type.zigTypeTag() == .Vector) ok: { |
| | 11901 | const zero_val = try Value.Tag.repeated.create(sema.arena, Value.zero); |
| | 11902 | const zero = try sema.addConstant(sema.typeOf(casted_rhs), zero_val); |
| | 11903 | const ok = try block.addCmpVector(casted_rhs, zero, if (scalar_tag == .Int) .gt else .neq, try sema.addType(resolved_type)); |
| | 11904 | break :ok try block.addInst(.{ |
| | 11905 | .tag = .reduce, |
| | 11906 | .data = .{ .reduce = .{ |
| | 11907 | .operand = ok, |
| | 11908 | .operation = .And, |
| | 11909 | } }, |
| | 11910 | }); |
| | 11911 | } else ok: { |
| | 11912 | const zero = try sema.addConstant(sema.typeOf(casted_rhs), Value.zero); |
| | 11913 | break :ok try block.addBinOp(if (scalar_tag == .Int) .cmp_gt else .cmp_neq, casted_rhs, zero); |
| | 11914 | }; |
| | 11915 | try sema.addSafetyCheck(block, ok, .remainder_division_zero_negative); |
| | 11916 | }, |
| | 11917 | else => {}, |
| | 11918 | } |
| 11880 | } | 11919 | } |
| 11881 | return block.addBinOp(rs.air_tag, casted_lhs, casted_rhs); | 11920 | return block.addBinOp(rs.air_tag, casted_lhs, casted_rhs); |
| 11882 | } | 11921 | } |
| ... | @@ -18813,6 +18852,8 @@ pub const PanicId = enum { | ... | @@ -18813,6 +18852,8 @@ pub const PanicId = enum { |
| 18813 | integer_overflow, | 18852 | integer_overflow, |
| 18814 | shl_overflow, | 18853 | shl_overflow, |
| 18815 | shr_overflow, | 18854 | shr_overflow, |
| | 18855 | divide_by_zero, |
| | 18856 | remainder_division_zero_negative, |
| 18816 | }; | 18857 | }; |
| 18817 | | 18858 | |
| 18818 | fn addSafetyCheck( | 18859 | fn addSafetyCheck( |
| ... | @@ -19031,6 +19072,8 @@ fn safetyPanic( | ... | @@ -19031,6 +19072,8 @@ fn safetyPanic( |
| 19031 | .integer_overflow => "integer overflow", | 19072 | .integer_overflow => "integer overflow", |
| 19032 | .shl_overflow => "left shift overflowed bits", | 19073 | .shl_overflow => "left shift overflowed bits", |
| 19033 | .shr_overflow => "right shift overflowed bits", | 19074 | .shr_overflow => "right shift overflowed bits", |
| | 19075 | .divide_by_zero => "division by zero", |
| | 19076 | .remainder_division_zero_negative => "remainder division by zero or negative value", |
| 19034 | }; | 19077 | }; |
| 19035 | | 19078 | |
| 19036 | const msg_inst = msg_inst: { | 19079 | const msg_inst = msg_inst: { |