From e0e2218fe79c0d29e5a9ccea7d9831c33aca5655 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 7 Jul 2024 13:37:25 +0800 Subject: [PATCH 1/2] checker: check expr evaluated but not used --- vlib/v/checker/checker.v | 6 ++++++ vlib/v/checker/tests/expr_evaluated_but_not_used.out | 6 ++++++ vlib/v/checker/tests/expr_evaluated_but_not_used.vv | 4 ++++ 3 files changed, 16 insertions(+) create mode 100644 vlib/v/checker/tests/expr_evaluated_but_not_used.out create mode 100644 vlib/v/checker/tests/expr_evaluated_but_not_used.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 626e60ea154c81..8663fb47c30a51 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2219,6 +2219,12 @@ fn (mut c Checker) block(mut node ast.Block) { c.stmts(mut node.stmts) c.inside_unsafe = prev_unsafe } else { + if node.stmts.len > 0 && node.stmts.last() is ast.ExprStmt { + last_stmt := node.stmts.last() as ast.ExprStmt + if last_stmt.expr !in [ast.CallExpr, ast.IfExpr, ast.MatchExpr, ast.InfixExpr] { + c.error('expression evaluated but not used', node.stmts.last().pos) + } + } c.stmts(mut node.stmts) } } diff --git a/vlib/v/checker/tests/expr_evaluated_but_not_used.out b/vlib/v/checker/tests/expr_evaluated_but_not_used.out new file mode 100644 index 00000000000000..d0b965e63f3861 --- /dev/null +++ b/vlib/v/checker/tests/expr_evaluated_but_not_used.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/expr_evaluated_but_not_used.vv:2:3: error: expression evaluated but not used + 1 | fn main() { + 2 | {1, 2, 3, 4} + | ^ + 3 | println('works') + 4 | } diff --git a/vlib/v/checker/tests/expr_evaluated_but_not_used.vv b/vlib/v/checker/tests/expr_evaluated_but_not_used.vv new file mode 100644 index 00000000000000..bedf35f47e26b9 --- /dev/null +++ b/vlib/v/checker/tests/expr_evaluated_but_not_used.vv @@ -0,0 +1,4 @@ +fn main() { + {1, 2, 3, 4} + println('works') +} From ad952abdc3265a98f3a6d2886272702fb48af2ea Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 7 Jul 2024 21:20:58 +0800 Subject: [PATCH 2/2] change error to warn and change test for it --- vlib/v/checker/checker.v | 2 +- .../v/checker/tests/expr_evaluated_but_not_used.out | 13 +++++++------ vlib/v/checker/tests/expr_evaluated_but_not_used.vv | 8 +++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8663fb47c30a51..4acbf3ea1dd90f 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2222,7 +2222,7 @@ fn (mut c Checker) block(mut node ast.Block) { if node.stmts.len > 0 && node.stmts.last() is ast.ExprStmt { last_stmt := node.stmts.last() as ast.ExprStmt if last_stmt.expr !in [ast.CallExpr, ast.IfExpr, ast.MatchExpr, ast.InfixExpr] { - c.error('expression evaluated but not used', node.stmts.last().pos) + c.warn('expression evaluated but not used', node.stmts.last().pos) } } c.stmts(mut node.stmts) diff --git a/vlib/v/checker/tests/expr_evaluated_but_not_used.out b/vlib/v/checker/tests/expr_evaluated_but_not_used.out index d0b965e63f3861..97c40823dee0f3 100644 --- a/vlib/v/checker/tests/expr_evaluated_but_not_used.out +++ b/vlib/v/checker/tests/expr_evaluated_but_not_used.out @@ -1,6 +1,7 @@ -vlib/v/checker/tests/expr_evaluated_but_not_used.vv:2:3: error: expression evaluated but not used - 1 | fn main() { - 2 | {1, 2, 3, 4} - | ^ - 3 | println('works') - 4 | } +vlib/v/checker/tests/expr_evaluated_but_not_used.vv:7:3: warning: expression evaluated but not used + 5 | println(3) + 6 | println(4) + 7 | 5 + | ^ + 8 | } + 9 | println('works') diff --git a/vlib/v/checker/tests/expr_evaluated_but_not_used.vv b/vlib/v/checker/tests/expr_evaluated_but_not_used.vv index bedf35f47e26b9..40ddfe9fd88786 100644 --- a/vlib/v/checker/tests/expr_evaluated_but_not_used.vv +++ b/vlib/v/checker/tests/expr_evaluated_but_not_used.vv @@ -1,4 +1,10 @@ fn main() { - {1, 2, 3, 4} + { + println(1) + println(2) + println(3) + println(4) + 5 + } println('works') }