From 92630a2821762951a5220b4283242c69e80fa2b7 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Thu, 8 Oct 2020 23:48:39 +0100 Subject: [PATCH] checker: error if assigning to a function (#6581) --- vlib/v/checker/checker.v | 2 ++ .../checker/tests/assign_multi_immutable_err.out | 16 +++++++++++++++- .../checker/tests/assign_multi_immutable_err.vv | 16 +++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 3c0f706fc3..69b4407d59 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1944,6 +1944,8 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) { if assign_stmt.op !in [.assign, .decl_assign] { c.error('cannot modify blank `_` identifier', left.pos) } + } else if left.info !is ast.IdentVar { + c.error('cannot assign to $left.kind `$left.name`', left.pos) } else { if is_decl { c.check_valid_snake_case(left.name, 'variable name', left.pos) diff --git a/vlib/v/checker/tests/assign_multi_immutable_err.out b/vlib/v/checker/tests/assign_multi_immutable_err.out index 44eb52dbe2..635e02059c 100644 --- a/vlib/v/checker/tests/assign_multi_immutable_err.out +++ b/vlib/v/checker/tests/assign_multi_immutable_err.out @@ -4,4 +4,18 @@ vlib/v/checker/tests/assign_multi_immutable_err.vv:4:2: error: `a` is immutable, 4 | a, b = 1, 2 | ^ 5 | - 6 | println('$a, $b') \ No newline at end of file + 6 | println('$a, $b') +vlib/v/checker/tests/assign_multi_immutable_err.vv:18:5: error: cannot assign to function `error` + 16 | + 17 | fn assign_fn() { + 18 | _, error = g() + | ~~~~~ + 19 | g = f() + 20 | } +vlib/v/checker/tests/assign_multi_immutable_err.vv:19:2: error: cannot assign to function `g` + 17 | fn assign_fn() { + 18 | _, error = g() + 19 | g = f() + | ^ + 20 | } + 21 | diff --git a/vlib/v/checker/tests/assign_multi_immutable_err.vv b/vlib/v/checker/tests/assign_multi_immutable_err.vv index a0c4f0d82d..cfed449fdd 100644 --- a/vlib/v/checker/tests/assign_multi_immutable_err.vv +++ b/vlib/v/checker/tests/assign_multi_immutable_err.vv @@ -4,4 +4,18 @@ fn main() { a, b = 1, 2 println('$a, $b') -} \ No newline at end of file +} + +fn f() int { + return 2 +} + +fn g() (int, int) { + return 1, 2 +} + +fn assign_fn() { + _, error = g() + g = f() +} +