From ab258aebfb9a5a5fbed0c918ca8260b3655e2970 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Mon, 3 Jul 2023 21:24:23 +0530 Subject: [PATCH] checker: disallow invalid prefix on left side of assign stmt (#18750) --- vlib/v/checker/assign.v | 5 +++++ .../invalid_prefix_left_side_assign_stmt_err.out | 14 ++++++++++++++ .../invalid_prefix_left_side_assign_stmt_err.vv | 6 ++++++ .../checker/tests/prefix_expr_decl_assign_err.out | 2 +- 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.out create mode 100644 vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.vv diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 06e5ecae4..78d1c84e5 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -392,6 +392,11 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { left.right.obj.is_used = true } } + } else if left.op == .amp { + c.error('cannot use a reference on the left side of `${node.op}`', + left.pos) + } else { + c.error('cannot use `${left.op}` on the left of `${node.op}`', left.pos) } if is_decl { c.error('non-name on the left side of `:=`', left.pos) diff --git a/vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.out b/vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.out new file mode 100644 index 000000000..3e39c227f --- /dev/null +++ b/vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.vv:3:2: error: cannot use `~` on the left of `=` + 1 | fn main() { + 2 | mut x := 0 + 3 | ~x = 34 + | ^ + 4 | &x = unsafe { nil } + 5 | println(x) +vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.vv:4:2: error: cannot use a reference on the left side of `=` + 2 | mut x := 0 + 3 | ~x = 34 + 4 | &x = unsafe { nil } + | ^ + 5 | println(x) + 6 | } diff --git a/vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.vv b/vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.vv new file mode 100644 index 000000000..24680d20f --- /dev/null +++ b/vlib/v/checker/tests/invalid_prefix_left_side_assign_stmt_err.vv @@ -0,0 +1,6 @@ +fn main() { + mut x := 0 + ~x = 34 + &x = unsafe { nil } + println(x) +} diff --git a/vlib/v/checker/tests/prefix_expr_decl_assign_err.out b/vlib/v/checker/tests/prefix_expr_decl_assign_err.out index 575fc0f31..70986913a 100644 --- a/vlib/v/checker/tests/prefix_expr_decl_assign_err.out +++ b/vlib/v/checker/tests/prefix_expr_decl_assign_err.out @@ -1,4 +1,4 @@ -vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:2:5: error: non-name on the left side of `:=` +vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:2:5: error: cannot use a reference on the left side of `:=` 1 | fn main() { 2 | &a := 12 | ^ -- 2.39.5