authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-01-08 22:35:31-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-01-08 22:35:31-05:00
log8d27a027051e93e6f63aa9b969fed1dbfcf2aa73
tree8bcf4f88dd85a8907a42c3b49a51f5e5520cb571
parent6caf32195af7aab084f3f2fee37239de0eb67adb

pass division by zero test


1 files changed, 19 insertions(+), 0 deletions(-)

src/ir.cpp+19
...@@ -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;