From 3d3549d65a0c2e0330c1dd53ff2791eddfb78bd5 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 3 Jul 2020 22:30:51 +0200 Subject: [PATCH] Revert "parser: advanced division by zero check (#5629)" This reverts commit f03688e443b2519299706e7b3dc2ecfad07c412d. --- vlib/v/checker/checker.v | 8 ++++ .../tests/division_by_zero_float_err.out | 2 +- .../tests/division_by_zero_float_err.vv | 0 .../tests/division_by_zero_int_err.out | 2 +- .../tests/division_by_zero_int_err.vv | 0 vlib/v/parser/pratt.v | 42 ------------------- .../parser/tests/division_by_zero_0b0_err.out | 5 --- .../parser/tests/division_by_zero_0b0_err.vv | 3 -- .../parser/tests/division_by_zero_0x0_err.out | 5 --- .../parser/tests/division_by_zero_0x0_err.vv | 3 -- .../tests/division_by_zero_0x0_var_err.out | 6 --- .../tests/division_by_zero_0x0_var_err.vv | 4 -- .../tests/division_by_zero_float_var_err.out | 6 --- .../tests/division_by_zero_float_var_err.vv | 4 -- .../tests/division_by_zero_int_var_err.out | 6 --- .../tests/division_by_zero_int_var_err.vv | 4 -- 16 files changed, 10 insertions(+), 90 deletions(-) rename vlib/v/{parser => checker}/tests/division_by_zero_float_err.out (52%) rename vlib/v/{parser => checker}/tests/division_by_zero_float_err.vv (100%) rename vlib/v/{parser => checker}/tests/division_by_zero_int_err.out (50%) rename vlib/v/{parser => checker}/tests/division_by_zero_int_err.vv (100%) delete mode 100644 vlib/v/parser/tests/division_by_zero_0b0_err.out delete mode 100644 vlib/v/parser/tests/division_by_zero_0b0_err.vv delete mode 100644 vlib/v/parser/tests/division_by_zero_0x0_err.out delete mode 100644 vlib/v/parser/tests/division_by_zero_0x0_err.vv delete mode 100644 vlib/v/parser/tests/division_by_zero_0x0_var_err.out delete mode 100644 vlib/v/parser/tests/division_by_zero_0x0_var_err.vv delete mode 100644 vlib/v/parser/tests/division_by_zero_float_var_err.out delete mode 100644 vlib/v/parser/tests/division_by_zero_float_var_err.vv delete mode 100644 vlib/v/parser/tests/division_by_zero_int_var_err.out delete mode 100644 vlib/v/parser/tests/division_by_zero_int_var_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 2df4aa4502..0b38ce2e1a 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -548,6 +548,14 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type { } } } + if infix_expr.op in [.div, .mod] { + if (infix_expr.right is ast.IntegerLiteral && + infix_expr.right.str() == '0') || + (infix_expr.right is ast.FloatLiteral && infix_expr.right.str().f64() == 0.0) { + oper := if infix_expr.op == .div { 'division' } else { 'modulo' } + c.error('$oper by zero', right_pos) + } + } return_type = promoted_type } } diff --git a/vlib/v/parser/tests/division_by_zero_float_err.out b/vlib/v/checker/tests/division_by_zero_float_err.out similarity index 52% rename from vlib/v/parser/tests/division_by_zero_float_err.out rename to vlib/v/checker/tests/division_by_zero_float_err.out index c59a1032c3..f7b7609eff 100644 --- a/vlib/v/parser/tests/division_by_zero_float_err.out +++ b/vlib/v/checker/tests/division_by_zero_float_err.out @@ -1,4 +1,4 @@ -vlib/v/parser/tests/division_by_zero_float_err.v:2:14: error: division by zero +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) | ~~~ diff --git a/vlib/v/parser/tests/division_by_zero_float_err.vv b/vlib/v/checker/tests/division_by_zero_float_err.vv similarity index 100% rename from vlib/v/parser/tests/division_by_zero_float_err.vv rename to vlib/v/checker/tests/division_by_zero_float_err.vv diff --git a/vlib/v/parser/tests/division_by_zero_int_err.out b/vlib/v/checker/tests/division_by_zero_int_err.out similarity index 50% rename from vlib/v/parser/tests/division_by_zero_int_err.out rename to vlib/v/checker/tests/division_by_zero_int_err.out index a7af55da33..3e00c2c739 100644 --- a/vlib/v/parser/tests/division_by_zero_int_err.out +++ b/vlib/v/checker/tests/division_by_zero_int_err.out @@ -1,4 +1,4 @@ -vlib/v/parser/tests/division_by_zero_int_err.v:2:12: error: division by zero +vlib/v/checker/tests/division_by_zero_int_err.v:2:12: error: division by zero 1 | fn main() { 2 | println(1/0) | ^ diff --git a/vlib/v/parser/tests/division_by_zero_int_err.vv b/vlib/v/checker/tests/division_by_zero_int_err.vv similarity index 100% rename from vlib/v/parser/tests/division_by_zero_int_err.vv rename to vlib/v/checker/tests/division_by_zero_int_err.vv diff --git a/vlib/v/parser/pratt.v b/vlib/v/parser/pratt.v index a8cd9ad715..870b1758e1 100644 --- a/vlib/v/parser/pratt.v +++ b/vlib/v/parser/pratt.v @@ -239,28 +239,6 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr { p.expecting_type = true } right = p.expr(precedence) - - if op in [.div, .mod] { - oper := if op == .div { 'division' } else { 'modulo' } - match right { - ast.FloatLiteral { - if it.val.f64() == 0.0 { - p.error_with_pos('$oper by zero', right.pos) - } - } - ast.Ident { - if p.is_var_zero(right.name) { - p.error_with_pos('$oper by zero', right.pos) - } - } - ast.IntegerLiteral { - if it.val.int() == 0 { - p.error_with_pos('$oper by zero', right.pos) - } - } - else {} - } - } return ast.InfixExpr{ left: left right: right @@ -269,26 +247,6 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr { } } -fn (mut p Parser) is_var_zero(name string) bool { - var := p.scope.find_var(name) or { - return false - } - match var.expr { - ast.FloatLiteral { - if it.val.f64() == 0.0 { - return true - } - } - ast.IntegerLiteral { - if it.val.int() == 0 { - return true - } - } - else {} - } - return false -} - fn (mut p Parser) prefix_expr() ast.PrefixExpr { pos := p.tok.position() op := p.tok.kind diff --git a/vlib/v/parser/tests/division_by_zero_0b0_err.out b/vlib/v/parser/tests/division_by_zero_0b0_err.out deleted file mode 100644 index bd43770085..0000000000 --- a/vlib/v/parser/tests/division_by_zero_0b0_err.out +++ /dev/null @@ -1,5 +0,0 @@ -vlib/v/parser/tests/division_by_zero_0b0_err.v:2:12: error: division by zero - 1 | fn main() { - 2 | println(1/0b0) - | ~~~ - 3 | } diff --git a/vlib/v/parser/tests/division_by_zero_0b0_err.vv b/vlib/v/parser/tests/division_by_zero_0b0_err.vv deleted file mode 100644 index 1f8ece86d4..0000000000 --- a/vlib/v/parser/tests/division_by_zero_0b0_err.vv +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println(1/0b0) -} diff --git a/vlib/v/parser/tests/division_by_zero_0x0_err.out b/vlib/v/parser/tests/division_by_zero_0x0_err.out deleted file mode 100644 index 4cfc8d1342..0000000000 --- a/vlib/v/parser/tests/division_by_zero_0x0_err.out +++ /dev/null @@ -1,5 +0,0 @@ -vlib/v/parser/tests/division_by_zero_0x0_err.v:2:12: error: division by zero - 1 | fn main() { - 2 | println(1/0x0) - | ~~~ - 3 | } diff --git a/vlib/v/parser/tests/division_by_zero_0x0_err.vv b/vlib/v/parser/tests/division_by_zero_0x0_err.vv deleted file mode 100644 index 812eb2cbe9..0000000000 --- a/vlib/v/parser/tests/division_by_zero_0x0_err.vv +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println(1/0x0) -} diff --git a/vlib/v/parser/tests/division_by_zero_0x0_var_err.out b/vlib/v/parser/tests/division_by_zero_0x0_var_err.out deleted file mode 100644 index ebee0a7632..0000000000 --- a/vlib/v/parser/tests/division_by_zero_0x0_var_err.out +++ /dev/null @@ -1,6 +0,0 @@ -vlib/v/parser/tests/division_by_zero_0x0_var_err.v:3:12: error: division by zero - 1 | fn main() { - 2 | a := 0x0 - 3 | println(1/a) - | ^ - 4 | } diff --git a/vlib/v/parser/tests/division_by_zero_0x0_var_err.vv b/vlib/v/parser/tests/division_by_zero_0x0_var_err.vv deleted file mode 100644 index c7c3066f7d..0000000000 --- a/vlib/v/parser/tests/division_by_zero_0x0_var_err.vv +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - a := 0x0 - println(1/a) -} diff --git a/vlib/v/parser/tests/division_by_zero_float_var_err.out b/vlib/v/parser/tests/division_by_zero_float_var_err.out deleted file mode 100644 index 4a4dbcdc0d..0000000000 --- a/vlib/v/parser/tests/division_by_zero_float_var_err.out +++ /dev/null @@ -1,6 +0,0 @@ -vlib/v/parser/tests/division_by_zero_float_var_err.v:3:14: error: division by zero - 1 | fn main() { - 2 | a := 0.0 - 3 | println(1.0/a) - | ^ - 4 | } diff --git a/vlib/v/parser/tests/division_by_zero_float_var_err.vv b/vlib/v/parser/tests/division_by_zero_float_var_err.vv deleted file mode 100644 index 612e0df040..0000000000 --- a/vlib/v/parser/tests/division_by_zero_float_var_err.vv +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - a := 0.0 - println(1.0/a) -} diff --git a/vlib/v/parser/tests/division_by_zero_int_var_err.out b/vlib/v/parser/tests/division_by_zero_int_var_err.out deleted file mode 100644 index 0a4ccaebf5..0000000000 --- a/vlib/v/parser/tests/division_by_zero_int_var_err.out +++ /dev/null @@ -1,6 +0,0 @@ -vlib/v/parser/tests/division_by_zero_int_var_err.v:3:12: error: division by zero - 1 | fn main() { - 2 | a := 0 - 3 | println(1/a) - | ^ - 4 | } diff --git a/vlib/v/parser/tests/division_by_zero_int_var_err.vv b/vlib/v/parser/tests/division_by_zero_int_var_err.vv deleted file mode 100644 index bcf6bec0b6..0000000000 --- a/vlib/v/parser/tests/division_by_zero_int_var_err.vv +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - a := 0 - println(1/a) -}