Skip to content

Commit 17b5762

Browse files
authored
checker: change 'fail_if_immutable(expr_ ast.Expr)' to 'fail_if_immutable(mut expr ast.Expr)' (#18811)
1 parent b3a6b73 commit 17b5762

File tree

7 files changed

+28
-28
lines changed

7 files changed

+28
-28
lines changed

vlib/v/checker/assign.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) {
227227
}
228228
} else {
229229
// Make sure the variable is mutable
230-
c.fail_if_immutable(left)
230+
c.fail_if_immutable(mut left)
231231

232232
if !is_blank_ident && !left_type.has_flag(.option) && right_type.has_flag(.option) {
233233
c.error('cannot assign an Option value to a non-option variable', right.pos())

vlib/v/checker/checker.v

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -661,21 +661,21 @@ fn (mut c Checker) expand_iface_embeds(idecl &ast.InterfaceDecl, level int, ifac
661661

662662
// returns name and position of variable that needs write lock
663663
// also sets `is_changed` to true (TODO update the name to reflect this?)
664-
fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
664+
fn (mut c Checker) fail_if_immutable(mut expr ast.Expr) (string, token.Pos) {
665665
mut to_lock := '' // name of variable that needs lock
666666
mut pos := token.Pos{} // and its position
667667
mut explicit_lock_needed := false
668-
mut expr := unsafe { expr_ }
669668
match mut expr {
670669
ast.CastExpr {
671670
// TODO
672671
return '', expr.pos
673672
}
674673
ast.ComptimeSelector {
674+
mut expr_left := expr.left
675675
if mut expr.left is ast.Ident {
676676
if mut expr.left.obj is ast.Var {
677677
if expr.left.obj.ct_type_var != .generic_param {
678-
c.fail_if_immutable(expr.left)
678+
c.fail_if_immutable(mut expr_left)
679679
}
680680
}
681681
}
@@ -735,21 +735,21 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
735735
c.error('you have to create a handle and `lock` it to modify `shared` ${kind} element',
736736
expr.left.pos().extend(expr.pos))
737737
}
738-
to_lock, pos = c.fail_if_immutable(expr.left)
738+
to_lock, pos = c.fail_if_immutable(mut expr.left)
739739
}
740740
ast.ParExpr {
741-
to_lock, pos = c.fail_if_immutable(expr.expr)
741+
to_lock, pos = c.fail_if_immutable(mut expr.expr)
742742
}
743743
ast.PrefixExpr {
744744
if expr.op == .mul && expr.right is ast.Ident {
745745
// Do not fail if dereference is immutable:
746746
// `*x = foo()` doesn't modify `x`
747747
} else {
748-
to_lock, pos = c.fail_if_immutable(expr.right)
748+
to_lock, pos = c.fail_if_immutable(mut expr.right)
749749
}
750750
}
751751
ast.PostfixExpr {
752-
to_lock, pos = c.fail_if_immutable(expr.expr)
752+
to_lock, pos = c.fail_if_immutable(mut expr.expr)
753753
}
754754
ast.SelectorExpr {
755755
if expr.expr_type == 0 {
@@ -792,7 +792,7 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
792792
c.error('field `${expr.field_name}` of struct `${type_str}` is immutable',
793793
expr.pos)
794794
}
795-
to_lock, pos = c.fail_if_immutable(expr.expr)
795+
to_lock, pos = c.fail_if_immutable(mut expr.expr)
796796
}
797797
if to_lock != '' {
798798
// No automatic lock for struct access
@@ -812,7 +812,7 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
812812
expr.pos)
813813
return '', expr.pos
814814
}
815-
c.fail_if_immutable(expr.expr)
815+
c.fail_if_immutable(mut expr.expr)
816816
}
817817
.sum_type {
818818
sumtype_info := typ_sym.info as ast.SumType
@@ -827,7 +827,7 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
827827
expr.pos)
828828
return '', expr.pos
829829
}
830-
c.fail_if_immutable(expr.expr)
830+
c.fail_if_immutable(mut expr.expr)
831831
}
832832
.array, .string {
833833
// should only happen in `builtin` and unsafe blocks
@@ -838,7 +838,7 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
838838
}
839839
}
840840
.aggregate, .placeholder {
841-
c.fail_if_immutable(expr.expr)
841+
c.fail_if_immutable(mut expr.expr)
842842
}
843843
else {
844844
c.error('unexpected symbol `${typ_sym.kind}`', expr.pos)
@@ -849,7 +849,7 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) {
849849
ast.CallExpr {
850850
// TODO: should only work for builtin method
851851
if expr.name == 'slice' {
852-
to_lock, pos = c.fail_if_immutable(expr.left)
852+
to_lock, pos = c.fail_if_immutable(mut expr.left)
853853
if to_lock != '' {
854854
// No automatic lock for array slicing (yet(?))
855855
explicit_lock_needed = true
@@ -2153,7 +2153,7 @@ fn (mut c Checker) asm_ios(mut ios []ast.AsmIO, mut scope ast.Scope, output bool
21532153
for mut io in ios {
21542154
typ := c.expr(mut io.expr)
21552155
if output {
2156-
c.fail_if_immutable(io.expr)
2156+
c.fail_if_immutable(mut io.expr)
21572157
}
21582158
if io.alias != '' {
21592159
aliases << io.alias

vlib/v/checker/fn.v

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,7 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast.
11011101
call_arg.pos)
11021102
}
11031103
if call_arg.is_mut {
1104-
to_lock, pos := c.fail_if_immutable(call_arg.expr)
1104+
to_lock, pos := c.fail_if_immutable(mut call_arg.expr)
11051105
if !call_arg.expr.is_lvalue() {
11061106
if call_arg.expr is ast.StructInit {
11071107
c.error('cannot pass a struct initialization as `mut`, you may want to use a variable `mut var := ${call_arg.expr}`',
@@ -1744,7 +1744,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
17441744
arg.pos)
17451745
}
17461746
if arg.is_mut {
1747-
to_lock, pos := c.fail_if_immutable(arg.expr)
1747+
to_lock, pos := c.fail_if_immutable(mut arg.expr)
17481748
if !param.is_mut {
17491749
tok := arg.share.str()
17501750
c.error('`${node.name}` parameter ${i + 1} is not `${tok}`, `${tok}` is not needed`',
@@ -1846,7 +1846,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
18461846
node.pos)
18471847
}
18481848
if method.params[0].is_mut {
1849-
to_lock, pos := c.fail_if_immutable(node.left)
1849+
to_lock, pos := c.fail_if_immutable(mut node.left)
18501850
if !node.left.is_lvalue() {
18511851
c.error('cannot pass expression as `mut`', node.left.pos())
18521852
}
@@ -1968,7 +1968,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
19681968
arg.pos)
19691969
}
19701970
if arg.is_mut {
1971-
to_lock, pos := c.fail_if_immutable(arg.expr)
1971+
to_lock, pos := c.fail_if_immutable(mut arg.expr)
19721972
if !param_is_mut {
19731973
tok := arg.share.str()
19741974
c.error('`${node.name}` parameter `${param.name}` is not `${tok}`, `${tok}` is not needed`',
@@ -2426,7 +2426,7 @@ fn (mut c Checker) map_builtin_method_call(mut node ast.CallExpr, left_type ast.
24262426
c.error('`.${method_name}()` does not have any arguments', node.args[0].pos)
24272427
}
24282428
if method_name[0] == `m` {
2429-
c.fail_if_immutable(node.left)
2429+
c.fail_if_immutable(mut node.left)
24302430
}
24312431
if node.left.is_auto_deref_var() || ret_type.has_flag(.shared_f) {
24322432
ret_type = left_type.deref()
@@ -2454,7 +2454,7 @@ fn (mut c Checker) map_builtin_method_call(mut node ast.CallExpr, left_type ast.
24542454
}
24552455
}
24562456
'delete' {
2457-
c.fail_if_immutable(node.left)
2457+
c.fail_if_immutable(mut node.left)
24582458
if node.args.len != 1 {
24592459
c.error('expected 1 argument, but got ${node.args.len}', node.pos)
24602460
}
@@ -2491,7 +2491,7 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as
24912491
c.error('the `sort()` method can be called only on mutable receivers, but `${node.left}` is a call expression',
24922492
node.pos)
24932493
}
2494-
c.fail_if_immutable(node.left)
2494+
c.fail_if_immutable(mut node.left)
24952495
// position of `a` and `b` doesn't matter, they're the same
24962496
scope_register_a_b(mut node.scope, node.pos, elem_typ)
24972497

@@ -2635,13 +2635,13 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as
26352635
}
26362636
node.return_type = array_info.elem_type
26372637
if method_name == 'pop' {
2638-
c.fail_if_immutable(node.left)
2638+
c.fail_if_immutable(mut node.left)
26392639
node.receiver_type = left_type.ref()
26402640
} else {
26412641
node.receiver_type = left_type
26422642
}
26432643
} else if method_name == 'delete' {
2644-
c.fail_if_immutable(node.left)
2644+
c.fail_if_immutable(mut node.left)
26452645
unwrapped_left_sym := c.table.sym(c.unwrap_generic(left_type))
26462646
if method := c.table.find_method(unwrapped_left_sym, method_name) {
26472647
node.receiver_type = method.receiver_type

vlib/v/checker/if.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ fn (mut c Checker) smartcast_if_conds(mut node ast.Expr, mut scope ast.Scope) {
509509
if is_variable {
510510
if (node.left is ast.Ident && node.left.is_mut)
511511
|| (node.left is ast.SelectorExpr && node.left.is_mut) {
512-
c.fail_if_immutable(node.left)
512+
c.fail_if_immutable(mut node.left)
513513
}
514514
// TODO: Add check for sum types in a way that it doesn't break a lot of compiler code
515515
if mut node.left is ast.Ident

vlib/v/checker/infix.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
505505
}
506506
// `array << elm`
507507
c.check_expr_opt_call(node.right, right_type)
508-
node.auto_locked, _ = c.fail_if_immutable(node.left)
508+
node.auto_locked, _ = c.fail_if_immutable(mut node.left)
509509
left_value_type := c.table.value_type(c.unwrap_generic(left_type))
510510
left_value_sym := c.table.sym(c.unwrap_generic(left_value_type))
511511
if left_value_sym.kind == .interface_ {
@@ -661,7 +661,7 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
661661
}
662662
if chan_info.is_mut {
663663
// TODO: The error message of the following could be more specific...
664-
c.fail_if_immutable(node.right)
664+
c.fail_if_immutable(mut node.right)
665665
}
666666
if elem_type.is_ptr() && !right_type.is_ptr() {
667667
c.error('cannot push non-reference `${right_sym.name}` on `${left_sym.name}`',

vlib/v/checker/match.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type {
2424
node.cond_type = ast.mktyp(cond_type)
2525
if (node.cond is ast.Ident && node.cond.is_mut)
2626
|| (node.cond is ast.SelectorExpr && node.cond.is_mut) {
27-
c.fail_if_immutable(node.cond)
27+
c.fail_if_immutable(mut node.cond)
2828
}
2929
c.ensure_type_exists(node.cond_type, node.pos) or { return ast.void_type }
3030
c.check_expr_opt_call(node.cond, cond_type)

vlib/v/checker/postfix.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fn (mut c Checker) postfix_expr(mut node ast.PostfixExpr) ast.Type {
3737
c.error('invalid operation: ${node.op.str()} (non-numeric type `${typ_str}`)',
3838
node.pos)
3939
} else {
40-
node.auto_locked, _ = c.fail_if_immutable(node.expr)
40+
node.auto_locked, _ = c.fail_if_immutable(mut node.expr)
4141
}
4242
node.typ = typ
4343
return typ

0 commit comments

Comments
 (0)