From 45a556ab34a9def37f51a0e13b9213fc361fc73d Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Wed, 23 Mar 2022 12:28:57 +0000 Subject: [PATCH] Also detect mutable assignment, not just initialization --- vlib/v/checker/assign.v | 2 +- vlib/v/checker/tests/index_expr_mutation.out | 38 +++++++++++++------- vlib/v/checker/tests/index_expr_mutation.vv | 1 + 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index b769084c86..c3cc2a51ef 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -338,7 +338,7 @@ pub fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { if left_sym.kind == .array && mut left is ast.Ident && mut right is ast.IndexExpr { sym := c.table.sym(right.left_type) if sym.kind == .array && mut right.left is ast.Ident { - if left.is_mut && !right.left.is_mut() { + if left.is_mut() && !right.left.is_mut() { if right.index is ast.RangeExpr { c.error('cannot mutate immutable slice', right.left.pos) } else { diff --git a/vlib/v/checker/tests/index_expr_mutation.out b/vlib/v/checker/tests/index_expr_mutation.out index ddf79a3cb5..3a2655039a 100644 --- a/vlib/v/checker/tests/index_expr_mutation.out +++ b/vlib/v/checker/tests/index_expr_mutation.out @@ -1,14 +1,28 @@ -vlib/v/checker/tests/index_expr_mutation.vv:3:11: error: cannot mutate immutable slice - 1 | fn test_immutable_slice() { - 2 | arr := [1, 2, 3, 4, 5] - 3 | mut s := arr[1..2] +vlib/v/checker/tests/index_expr_mutation.vv:5:11: error: cannot mutate immutable slice + 3 | fn test_immutable_slice() { + 4 | arr := [1, 2, 3, 4, 5] + 5 | mut s := arr[1..2] | ~~~ - 4 | s[0] = 0 - 5 | } -vlib/v/checker/tests/index_expr_mutation.vv:9:11: error: cannot mutate immutable element - 7 | fn test_immutable_element() { - 8 | a := [[1]] - 9 | mut b := a[0] + 6 | s[0] = 0 + 7 | s = arr[1..2] +vlib/v/checker/tests/index_expr_mutation.vv:7:6: error: cannot mutate immutable slice + 5 | mut s := arr[1..2] + 6 | s[0] = 0 + 7 | s = arr[1..2] + | ~~~ + 8 | mut s2 := imm_arr[..] + 9 | s2[0] = 0 +vlib/v/checker/tests/index_expr_mutation.vv:8:12: error: cannot mutate immutable slice + 6 | s[0] = 0 + 7 | s = arr[1..2] + 8 | mut s2 := imm_arr[..] + | ~~~~~~~ + 9 | s2[0] = 0 + 10 | } +vlib/v/checker/tests/index_expr_mutation.vv:14:11: error: cannot mutate immutable element + 12 | fn test_immutable_element() { + 13 | a := [[1]] + 14 | mut b := a[0] | ^ - 10 | b[0] = 0 - 11 | } + 15 | b[0] = 0 + 16 | } diff --git a/vlib/v/checker/tests/index_expr_mutation.vv b/vlib/v/checker/tests/index_expr_mutation.vv index 28627fc11b..f651a76da2 100644 --- a/vlib/v/checker/tests/index_expr_mutation.vv +++ b/vlib/v/checker/tests/index_expr_mutation.vv @@ -4,6 +4,7 @@ fn test_immutable_slice() { arr := [1, 2, 3, 4, 5] mut s := arr[1..2] s[0] = 0 + s = arr[1..2] mut s2 := imm_arr[..] s2[0] = 0 }