From 34c89258a46ed41958cd2df10f3654be6d3157e4 Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 29 Dec 2020 18:50:25 +0800 Subject: [PATCH] cgen: fix array of array/map init (fix #7597) (#7671) --- vlib/builtin/array_test.v | 16 ++++++++++++++++ vlib/v/gen/array.v | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/vlib/builtin/array_test.v b/vlib/builtin/array_test.v index ee3b892b74..c549317319 100644 --- a/vlib/builtin/array_test.v +++ b/vlib/builtin/array_test.v @@ -1291,3 +1291,19 @@ fn test_array_struct_ref_index() { println(coords.index(coord_1)) assert coords.index(coord_1) == 0 } + +fn test_array_of_array_append() { + mut x := [][]int{len: 4} + println(x) // OK + x[2] << 123 // RTE + println(x) + assert '$x' == '[[], [], [123], []]' +} + +fn test_array_of_map_insert() { + mut x := []map[string]int{len: 4} + println(x) // OK + x[2]['123'] = 123 // RTE + println(x) + assert '$x' == "[{}, {}, {'123': 123}, {}]" +} diff --git a/vlib/v/gen/array.v b/vlib/v/gen/array.v index f98e17b422..08f1986509 100644 --- a/vlib/v/gen/array.v +++ b/vlib/v/gen/array.v @@ -79,6 +79,10 @@ fn (mut g Gen) array_init(it ast.ArrayInit) { g.write('&($elem_type_str[]){') g.write('_SLIT("")') g.write('})') + } else if it.has_len && elem_sym.kind in [.array, .map] { + g.write('(voidptr)&($elem_type_str[]){') + g.write(g.type_default(it.elem_type)) + g.write('}[0])') } else { g.write('0)') }