From 34163ae44b85b614598cc0a246597ef08d5cba70 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+tobealive@users.noreply.github.com> Date: Thu, 15 Jun 2023 01:07:25 +0200 Subject: [PATCH] checker: extend check assigning mut reference to immutable var in nested parens (#18442) --- vlib/v/checker/assign.v | 6 +- ...ble_reference_var_with_parenthesis_err.out | 76 ++++++++++++++++++- ...able_reference_var_with_parenthesis_err.vv | 6 +- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 04101c2b2c..fab84b0fb9 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -733,7 +733,11 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { c.inside_ref_lit = old_inside_ref_lit if right_node.op == .amp { expr := if right_node.right is ast.ParExpr { - right_node.right.expr + mut expr_ := right_node.right.expr + for mut expr_ is ast.ParExpr { + expr_ = expr_.expr + } + expr_ } else { right_node.right } diff --git a/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.out b/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.out index be8c568c1d..0c25302819 100644 --- a/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.out +++ b/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.out @@ -1,7 +1,77 @@ +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:11:12: warning: redundant parentheses are used + 9 | fn foo() { + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + | ~~~~~~~~~~ + 12 | mut c := &((((a_char)))) + 13 | println(a) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:11:12: warning: redundant parentheses are used + 9 | fn foo() { + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + | ~~~~~~~~~~ + 12 | mut c := &((((a_char)))) + 13 | println(a) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:12: warning: redundant parentheses are used + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ~~~~~~~~~~~~~~ + 13 | println(a) + 14 | println(b) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:13: warning: redundant parentheses are used + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ~~~~~~~~~~~~ + 13 | println(a) + 14 | println(b) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:14: warning: redundant parentheses are used + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ~~~~~~~~~~ + 13 | println(a) + 14 | println(b) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:12: warning: redundant parentheses are used + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ~~~~~~~~~~~~~~ + 13 | println(a) + 14 | println(b) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:13: warning: redundant parentheses are used + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ~~~~~~~~~~~~ + 13 | println(a) + 14 | println(b) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:14: warning: redundant parentheses are used + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ~~~~~~~~~~ + 13 | println(a) + 14 | println(b) vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:10:11: error: `a_char` is immutable, cannot have a mutable reference to it 8 | 9 | fn foo() { - 10 | mut c := &(a_char) + 10 | mut a := &(a_char) | ^ - 11 | println(c) - 12 | } + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:11:11: error: `a_char` is immutable, cannot have a mutable reference to it + 9 | fn foo() { + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + | ^ + 12 | mut c := &((((a_char)))) + 13 | println(a) +vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv:12:11: error: `a_char` is immutable, cannot have a mutable reference to it + 10 | mut a := &(a_char) + 11 | mut b := &((a_char)) + 12 | mut c := &((((a_char)))) + | ^ + 13 | println(a) + 14 | println(b) diff --git a/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv b/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv index f92707982b..2a048ab605 100644 --- a/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv +++ b/vlib/v/checker/tests/assign_immutable_reference_var_with_parenthesis_err.vv @@ -7,6 +7,10 @@ const a_char = MyChar{ } fn foo() { - mut c := &(a_char) + mut a := &(a_char) + mut b := &((a_char)) + mut c := &((((a_char)))) + println(a) + println(b) println(c) }