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())
|
||||||
|
|
|
@ -26,3 +26,10 @@ vlib/v/checker/tests/array_or_map_assign_err.vv:10:7: error: cannot copy map: ca
|
||||||
| ~~
|
| ~~
|
||||||
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)
|
||||||
|
|
|
@ -11,4 +11,14 @@ fn main() {
|
||||||
|
|
||||||
_ = 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