| ... | ... | @@ -11877,6 +11877,45 @@ fn analyzeArithmetic( |
| 11877 | 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 | 11920 | return block.addBinOp(rs.air_tag, casted_lhs, casted_rhs); |
| 11882 | 11921 | } |
| ... | ... | @@ -18813,6 +18852,8 @@ pub const PanicId = enum { |
| 18813 | 18852 | integer_overflow, |
| 18814 | 18853 | shl_overflow, |
| 18815 | 18854 | shr_overflow, |
| 18855 | divide_by_zero, |
| 18856 | remainder_division_zero_negative, |
| 18816 | 18857 | }; |
| 18817 | 18858 | |
| 18818 | 18859 | fn addSafetyCheck( |
| ... | ... | @@ -19031,6 +19072,8 @@ fn safetyPanic( |
| 19031 | 19072 | .integer_overflow => "integer overflow", |
| 19032 | 19073 | .shl_overflow => "left shift overflowed bits", |
| 19033 | 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 | 19079 | const msg_inst = msg_inst: { |