diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index bba758f16f..3189f77c2f 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1975,6 +1975,9 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) { c.error('modifying variables via dereferencing can only be done in `unsafe` blocks', assign_stmt.pos) } + if is_decl { + c.error('non-name on the left side of `:=`', left.pos) + } } else { if is_decl { diff --git a/vlib/v/checker/tests/prefix_expr_decl_assign_err.out b/vlib/v/checker/tests/prefix_expr_decl_assign_err.out new file mode 100644 index 0000000000..f18057d0ac --- /dev/null +++ b/vlib/v/checker/tests/prefix_expr_decl_assign_err.out @@ -0,0 +1,11 @@ +vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:2:5: error: non-name on the left side of `:=` + 1 | fn main() { + 2 | &a := 12 + | ^ + 3 | (*d) := 14 + 4 | } +vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:1:1: error: non-name `(*d)` on left side of `:=` + 1 | fn main() { + | ^ + 2 | &a := 12 + 3 | (*d) := 14 diff --git a/vlib/v/checker/tests/prefix_expr_decl_assign_err.vv b/vlib/v/checker/tests/prefix_expr_decl_assign_err.vv new file mode 100644 index 0000000000..3cfff48519 --- /dev/null +++ b/vlib/v/checker/tests/prefix_expr_decl_assign_err.vv @@ -0,0 +1,4 @@ +fn main() { + &a := 12 + (*d) := 14 +} diff --git a/vlib/v/parser/pratt.v b/vlib/v/parser/pratt.v index bcf5c2cb9c..d32d5c1ee8 100644 --- a/vlib/v/parser/pratt.v +++ b/vlib/v/parser/pratt.v @@ -60,7 +60,7 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr { p.next() } .minus, .amp, .mul, .not, .bit_not, .arrow { - // -1, -a, !x, &x, ~x + // -1, -a, !x, &x, ~x, <-a node = p.prefix_expr() } .key_true, .key_false {