all: fix map = map2 assignment (#8581)
parent
57258c2988
commit
1b6efebac7
|
@ -2713,7 +2713,14 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
|
||||||
&& right_sym.kind == .array && (left is ast.Ident && !left.is_blank_ident())
|
&& right_sym.kind == .array && (left is ast.Ident && !left.is_blank_ident())
|
||||||
&& right is ast.Ident {
|
&& right is ast.Ident {
|
||||||
// Do not allow `a = b`, only `a = b.clone()`
|
// Do not allow `a = b`, only `a = b.clone()`
|
||||||
c.error('use `array2 = array1.clone()` instead of `array2 = array1` (or use `unsafe`)',
|
c.error('use `array2 $assign_stmt.op.str() array1.clone()` instead of `array2 $assign_stmt.op.str() array1` (or use `unsafe`)',
|
||||||
|
assign_stmt.pos)
|
||||||
|
}
|
||||||
|
if left_sym.kind == .map && !c.inside_unsafe && assign_stmt.op in [.assign, .decl_assign]
|
||||||
|
&& right_sym.kind == .map && (left is ast.Ident && !left.is_blank_ident())
|
||||||
|
&& right is ast.Ident {
|
||||||
|
// Do not allow `a = b`, only `a = b.clone()`
|
||||||
|
c.error('use `map2 $assign_stmt.op.str() map1.clone()` instead of `map2 $assign_stmt.op.str() map1` (or use `unsafe`)',
|
||||||
assign_stmt.pos)
|
assign_stmt.pos)
|
||||||
}
|
}
|
||||||
left_is_ptr := left_type.is_ptr() || left_sym.is_pointer()
|
left_is_ptr := left_type.is_ptr() || left_sym.is_pointer()
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
vlib/v/checker/tests/array_or_map_assign_err.vv:3:5: error: use `array2 := array1.clone()` instead of `array2 := array1` (or use `unsafe`)
|
||||||
|
1 | fn main() {
|
||||||
|
2 | a1 := [1, 2, 3]
|
||||||
|
3 | a2 := a1
|
||||||
|
| ~~
|
||||||
|
4 | mut a3 := []int{}
|
||||||
|
5 | a3 = a1
|
||||||
|
vlib/v/checker/tests/array_or_map_assign_err.vv:5:5: error: use `array2 = array1.clone()` instead of `array2 = array1` (or use `unsafe`)
|
||||||
|
3 | a2 := a1
|
||||||
|
4 | mut a3 := []int{}
|
||||||
|
5 | a3 = a1
|
||||||
|
| ^
|
||||||
|
6 |
|
||||||
|
7 | m1 := {'one': 1}
|
||||||
|
vlib/v/checker/tests/array_or_map_assign_err.vv:8:5: error: use `map2 := map1.clone()` instead of `map2 := map1` (or use `unsafe`)
|
||||||
|
6 |
|
||||||
|
7 | m1 := {'one': 1}
|
||||||
|
8 | m2 := m1
|
||||||
|
| ~~
|
||||||
|
9 | mut m3 := map[string]int{}
|
||||||
|
10 | m3 = m1
|
||||||
|
vlib/v/checker/tests/array_or_map_assign_err.vv:10:5: error: use `map2 = map1.clone()` instead of `map2 = map1` (or use `unsafe`)
|
||||||
|
8 | m2 := m1
|
||||||
|
9 | mut m3 := map[string]int{}
|
||||||
|
10 | m3 = m1
|
||||||
|
| ^
|
||||||
|
11 | }
|
|
@ -0,0 +1,11 @@
|
||||||
|
fn main() {
|
||||||
|
a1 := [1, 2, 3]
|
||||||
|
a2 := a1
|
||||||
|
mut a3 := []int{}
|
||||||
|
a3 = a1
|
||||||
|
|
||||||
|
m1 := {'one': 1}
|
||||||
|
m2 := m1
|
||||||
|
mut m3 := map[string]int{}
|
||||||
|
m3 = m1
|
||||||
|
}
|
Loading…
Reference in New Issue