From 861bbe68f20fa81805d4fa0cbd2756411f438a89 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Fri, 27 Sep 2024 04:55:17 +0530 Subject: [PATCH] checker: disallow infix exper on left side of assign (#22322) --- vlib/v/checker/assign.v | 4 ++++ .../tests/infix_expr_left_side_assogn_err.out | 13 +++++++++++++ .../tests/infix_expr_left_side_assogn_err.vv | 6 ++++++ vlib/v/checker/tests/invalid_literal_assign_err.out | 13 +++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 vlib/v/checker/tests/infix_expr_left_side_assogn_err.out create mode 100644 vlib/v/checker/tests/infix_expr_left_side_assogn_err.vv diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 0d4c90984..ebccbfb73 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -495,6 +495,10 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { left.recursive_mapset_is_setter(true) } } + if mut left is ast.InfixExpr { + c.error('cannot use infix expression on the left side of `${node.op}`', + left.pos) + } if is_decl { c.error('non-name `${left}` on left side of `:=`', left.pos()) } diff --git a/vlib/v/checker/tests/infix_expr_left_side_assogn_err.out b/vlib/v/checker/tests/infix_expr_left_side_assogn_err.out new file mode 100644 index 000000000..a7ca5f093 --- /dev/null +++ b/vlib/v/checker/tests/infix_expr_left_side_assogn_err.out @@ -0,0 +1,13 @@ +vlib/v/checker/tests/infix_expr_left_side_assogn_err.vv:4:4: error: cannot use infix expression on the left side of `=` + 2 | a := 69 + 3 | b := 420 + 4 | a + b = a + b + | ^ + 5 | (a + b) = a + b + 6 | } +vlib/v/checker/tests/infix_expr_left_side_assogn_err.vv:5:5: error: cannot use infix expression on the left side of `=` + 3 | b := 420 + 4 | a + b = a + b + 5 | (a + b) = a + b + | ^ + 6 | } diff --git a/vlib/v/checker/tests/infix_expr_left_side_assogn_err.vv b/vlib/v/checker/tests/infix_expr_left_side_assogn_err.vv new file mode 100644 index 000000000..92ba4615d --- /dev/null +++ b/vlib/v/checker/tests/infix_expr_left_side_assogn_err.vv @@ -0,0 +1,6 @@ +fn main() { + a := 69 + b := 420 + a + b = a + b + (a + b) = a + b +} diff --git a/vlib/v/checker/tests/invalid_literal_assign_err.out b/vlib/v/checker/tests/invalid_literal_assign_err.out index 1c87f47c6..2131ce5cc 100644 --- a/vlib/v/checker/tests/invalid_literal_assign_err.out +++ b/vlib/v/checker/tests/invalid_literal_assign_err.out @@ -47,6 +47,13 @@ vlib/v/checker/tests/invalid_literal_assign_err.vv:10:2: error: non-name literal | ~~~~ 11 | 3 + 5 = 3 & 4 12 | (3 + 3.5) = 4 + 6.4 +vlib/v/checker/tests/invalid_literal_assign_err.vv:11:4: error: cannot use infix expression on the left side of `=` + 9 | Foo{} = Foo{} + 10 | true = false + 11 | 3 + 5 = 3 & 4 + | ^ + 12 | (3 + 3.5) = 4 + 6.4 + 13 | } vlib/v/checker/tests/invalid_literal_assign_err.vv:11:2: error: non-name literal value `3 + 5` on left side of `=` 9 | Foo{} = Foo{} 10 | true = false @@ -54,6 +61,12 @@ vlib/v/checker/tests/invalid_literal_assign_err.vv:11:2: error: non-name literal | ~~~~~ 12 | (3 + 3.5) = 4 + 6.4 13 | } +vlib/v/checker/tests/invalid_literal_assign_err.vv:12:5: error: cannot use infix expression on the left side of `=` + 10 | true = false + 11 | 3 + 5 = 3 & 4 + 12 | (3 + 3.5) = 4 + 6.4 + | ^ + 13 | } vlib/v/checker/tests/invalid_literal_assign_err.vv:12:3: error: non-name literal value `3 + 3.5` on left side of `=` 10 | true = false 11 | 3 + 5 = 3 & 4 -- 2.39.5