| ... | @@ -6915,6 +6915,25 @@ static int ir_eval_bignum(ConstExprValue *op1_val, ConstExprValue *op2_val, | ... | @@ -6915,6 +6915,25 @@ static int ir_eval_bignum(ConstExprValue *op1_val, ConstExprValue *op2_val, |
| 6915 | ConstExprValue *out_val, bool (*bignum_fn)(BigNum *, BigNum *, BigNum *), | 6915 | ConstExprValue *out_val, bool (*bignum_fn)(BigNum *, BigNum *, BigNum *), |
| 6916 | TypeTableEntry *type, bool wrapping_op) | 6916 | TypeTableEntry *type, bool wrapping_op) |
| 6917 | { | 6917 | { |
| | 6918 | bool is_int = false; |
| | 6919 | bool is_float = false; |
| | 6920 | if (bignum_fn == bignum_div || bignum_fn == bignum_mod) { |
| | 6921 | if (type->id == TypeTableEntryIdInt || |
| | 6922 | type->id == TypeTableEntryIdNumLitInt) |
| | 6923 | { |
| | 6924 | is_int = true; |
| | 6925 | } else if (type->id == TypeTableEntryIdFloat || |
| | 6926 | type->id == TypeTableEntryIdNumLitFloat) |
| | 6927 | { |
| | 6928 | is_float = true; |
| | 6929 | } |
| | 6930 | if ((is_int && op2_val->data.x_bignum.data.x_uint == 0) || |
| | 6931 | (is_float && op2_val->data.x_bignum.data.x_float == 0.0)) |
| | 6932 | { |
| | 6933 | return ErrorDivByZero; |
| | 6934 | } |
| | 6935 | } |
| | 6936 | |
| 6918 | bool overflow = bignum_fn(&out_val->data.x_bignum, &op1_val->data.x_bignum, &op2_val->data.x_bignum); | 6937 | bool overflow = bignum_fn(&out_val->data.x_bignum, &op1_val->data.x_bignum, &op2_val->data.x_bignum); |
| 6919 | if (overflow) { | 6938 | if (overflow) { |
| 6920 | return ErrorOverflow; | 6939 | return ErrorOverflow; |