checker: check map copy error in fn_mut_arg (#9242)
parent
de73ef665c
commit
9fbb139e29
|
@ -2747,8 +2747,8 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
|
||||||
assign_stmt.pos)
|
assign_stmt.pos)
|
||||||
}
|
}
|
||||||
if left_sym.kind == .map && assign_stmt.op in [.assign, .decl_assign]
|
if left_sym.kind == .map && assign_stmt.op in [.assign, .decl_assign]
|
||||||
&& right_sym.kind == .map && !right_type.is_ptr() && !left.is_blank_ident()
|
&& right_sym.kind == .map && ((right is ast.Ident && right.is_auto_deref_var())
|
||||||
&& right.is_lvalue() {
|
|| !right_type.is_ptr()) && !left.is_blank_ident() && right.is_lvalue() {
|
||||||
// Do not allow `a = b`
|
// Do not allow `a = b`
|
||||||
c.error('cannot copy map: call `move` or `clone` method (or use a reference)',
|
c.error('cannot copy map: call `move` or `clone` method (or use a reference)',
|
||||||
right.position())
|
right.position())
|
||||||
|
|
|
@ -10,10 +10,10 @@ vlib/v/checker/tests/array_or_map_assign_err.vv:5:5: error: use `array2 = array1
|
||||||
4 | mut a3 := []int{}
|
4 | mut a3 := []int{}
|
||||||
5 | a3 = a1
|
5 | a3 = a1
|
||||||
| ^
|
| ^
|
||||||
6 |
|
6 |
|
||||||
7 | m1 := {'one': 1}
|
7 | m1 := {'one': 1}
|
||||||
vlib/v/checker/tests/array_or_map_assign_err.vv:8:8: error: cannot copy map: call `move` or `clone` method (or use a reference)
|
vlib/v/checker/tests/array_or_map_assign_err.vv:8:8: error: cannot copy map: call `move` or `clone` method (or use a reference)
|
||||||
6 |
|
6 |
|
||||||
7 | m1 := {'one': 1}
|
7 | m1 := {'one': 1}
|
||||||
8 | m2 := m1
|
8 | m2 := m1
|
||||||
| ~~
|
| ~~
|
||||||
|
@ -24,5 +24,12 @@ vlib/v/checker/tests/array_or_map_assign_err.vv:10:7: error: cannot copy map: ca
|
||||||
9 | mut m3 := map[string]int{}
|
9 | mut m3 := map[string]int{}
|
||||||
10 | m3 = m1
|
10 | m3 = m1
|
||||||
| ~~
|
| ~~
|
||||||
11 |
|
11 |
|
||||||
12 | _ = a2
|
12 | _ = a2
|
||||||
|
vlib/v/checker/tests/array_or_map_assign_err.vv:20:8: error: cannot copy map: call `move` or `clone` method (or use a reference)
|
||||||
|
18 |
|
||||||
|
19 | fn foo(mut m map[string]int) {
|
||||||
|
20 | m2 := m
|
||||||
|
| ^
|
||||||
|
21 | m['foo'] = 100
|
||||||
|
22 | println(m)
|
||||||
|
|
|
@ -8,7 +8,17 @@ fn main() {
|
||||||
m2 := m1
|
m2 := m1
|
||||||
mut m3 := map[string]int{}
|
mut m3 := map[string]int{}
|
||||||
m3 = m1
|
m3 = m1
|
||||||
|
|
||||||
_ = a2
|
_ = a2
|
||||||
_ = m2
|
_ = m2
|
||||||
|
|
||||||
|
mut m := {'foo':1}
|
||||||
|
foo(mut m)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo(mut m map[string]int) {
|
||||||
|
m2 := m
|
||||||
|
m['foo'] = 100
|
||||||
|
println(m)
|
||||||
|
println(m2)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue