From 117649f40d47ae5af5f109e7656408efa0e1aa7b Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 29 Apr 2020 16:07:27 +0800 Subject: [PATCH] checker: check devision by zero (int and float) --- vlib/v/checker/checker.v | 5 +++-- vlib/v/checker/tests/division_by_zero_err.out | 5 ----- vlib/v/checker/tests/division_by_zero_float_err.out | 5 +++++ vlib/v/checker/tests/division_by_zero_float_err.v | 3 +++ vlib/v/checker/tests/division_by_zero_float_err.vv | 3 +++ vlib/v/checker/tests/division_by_zero_int_err.out | 5 +++++ .../{division_by_zero_err.vv => division_by_zero_int_err.v} | 0 vlib/v/checker/tests/division_by_zero_int_err.vv | 3 +++ 8 files changed, 22 insertions(+), 7 deletions(-) delete mode 100644 vlib/v/checker/tests/division_by_zero_err.out create mode 100644 vlib/v/checker/tests/division_by_zero_float_err.out create mode 100644 vlib/v/checker/tests/division_by_zero_float_err.v create mode 100644 vlib/v/checker/tests/division_by_zero_float_err.vv create mode 100644 vlib/v/checker/tests/division_by_zero_int_err.out rename vlib/v/checker/tests/{division_by_zero_err.vv => division_by_zero_int_err.v} (100%) create mode 100644 vlib/v/checker/tests/division_by_zero_int_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index e7296d4d25..5cb9c5e38c 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -366,8 +366,9 @@ pub fn (mut c Checker) infix_expr(infix_expr mut ast.InfixExpr) table.Type { return table.bool_type } .plus, .minus, .mul, .div { - if infix_expr.op == .div && infix_expr.right is ast.IntegerLiteral && - infix_expr.right.str().int() == 0 { + if infix_expr.op == .div && + (infix_expr.right is ast.IntegerLiteral && infix_expr.right.str() == '0' || + infix_expr.right is ast.FloatLiteral && infix_expr.right.str().f64() == 0.0) { c.error('division by zero', infix_expr.right.position()) } if left.kind in [.array, .array_fixed, .map, .struct_] && !left.has_method(infix_expr.op.str()) { diff --git a/vlib/v/checker/tests/division_by_zero_err.out b/vlib/v/checker/tests/division_by_zero_err.out deleted file mode 100644 index 8f6d126f4f..0000000000 --- a/vlib/v/checker/tests/division_by_zero_err.out +++ /dev/null @@ -1,5 +0,0 @@ -vlib/v/checker/tests/division_by_zero_err.v:2:12: error: division by zero - 1| fn main() { - 2| println(1/0) - ^ - 3| } diff --git a/vlib/v/checker/tests/division_by_zero_float_err.out b/vlib/v/checker/tests/division_by_zero_float_err.out new file mode 100644 index 0000000000..87199582be --- /dev/null +++ b/vlib/v/checker/tests/division_by_zero_float_err.out @@ -0,0 +1,5 @@ +vlib/v/checker/tests/division_by_zero_float_err.v:2:14: error: division by zero + 1| fn main() { + 2| println(1.0/0.0) + ~~~ + 3| } diff --git a/vlib/v/checker/tests/division_by_zero_float_err.v b/vlib/v/checker/tests/division_by_zero_float_err.v new file mode 100644 index 0000000000..b5c1e7cb0b --- /dev/null +++ b/vlib/v/checker/tests/division_by_zero_float_err.v @@ -0,0 +1,3 @@ +fn main() { + println(1.0/0.0) +} diff --git a/vlib/v/checker/tests/division_by_zero_float_err.vv b/vlib/v/checker/tests/division_by_zero_float_err.vv new file mode 100644 index 0000000000..b5c1e7cb0b --- /dev/null +++ b/vlib/v/checker/tests/division_by_zero_float_err.vv @@ -0,0 +1,3 @@ +fn main() { + println(1.0/0.0) +} diff --git a/vlib/v/checker/tests/division_by_zero_int_err.out b/vlib/v/checker/tests/division_by_zero_int_err.out new file mode 100644 index 0000000000..3909bed15c --- /dev/null +++ b/vlib/v/checker/tests/division_by_zero_int_err.out @@ -0,0 +1,5 @@ +vlib/v/checker/tests/division_by_zero_int_err.v:2:12: error: division by zero + 1| fn main() { + 2| println(1/0) + ^ + 3| } diff --git a/vlib/v/checker/tests/division_by_zero_err.vv b/vlib/v/checker/tests/division_by_zero_int_err.v similarity index 100% rename from vlib/v/checker/tests/division_by_zero_err.vv rename to vlib/v/checker/tests/division_by_zero_int_err.v diff --git a/vlib/v/checker/tests/division_by_zero_int_err.vv b/vlib/v/checker/tests/division_by_zero_int_err.vv new file mode 100644 index 0000000000..996814a9a6 --- /dev/null +++ b/vlib/v/checker/tests/division_by_zero_int_err.vv @@ -0,0 +1,3 @@ +fn main() { + println(1/0) +}