diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 55e3af839ff04b..4da230e3c5230e 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -597,6 +597,13 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.', } } } + if mut left is ast.Ident { + if mut left.info is ast.IdentVar { + if left.info.is_static && right_sym.kind == .map { + c.error('maps cannot be static', left.pos) + } + } + } // Single side check match node.op { .assign {} // No need to do single side check for =. But here put it first for speed. diff --git a/vlib/v/checker/tests/static_maps_err.out b/vlib/v/checker/tests/static_maps_err.out new file mode 100644 index 00000000000000..500887fca479dd --- /dev/null +++ b/vlib/v/checker/tests/static_maps_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/static_maps_err.vv:3:13: error: maps cannot be static + 1 | @[unsafe] + 2 | fn foo() map[string]int { + 3 | mut static x := map[string]int{} + | ^ + 4 | return x + 5 | } diff --git a/vlib/v/checker/tests/static_maps_err.vv b/vlib/v/checker/tests/static_maps_err.vv new file mode 100644 index 00000000000000..d6e2bc107731d1 --- /dev/null +++ b/vlib/v/checker/tests/static_maps_err.vv @@ -0,0 +1,11 @@ +@[unsafe] +fn foo() map[string]int { + mut static x := map[string]int{} + return x +} + +fn main() { + unsafe { + foo() + } +}