Skip to content

Commit d3c679b

Browse files
authored
cgen: fix fixed array of map (#18347)
1 parent 254ed17 commit d3c679b

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

vlib/v/checker/checker.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,6 +2530,12 @@ pub fn (mut c Checker) expr(node_ ast.Expr) ast.Type {
25302530

25312531
unwrapped_expr_type := c.unwrap_generic(node.expr_type)
25322532
tsym := c.table.sym(unwrapped_expr_type)
2533+
if tsym.kind == .array_fixed {
2534+
info := tsym.info as ast.ArrayFixed
2535+
// for dumping fixed array we must registed the fixed array struct to return from function
2536+
c.table.find_or_register_array_fixed(info.elem_type, info.size, info.size_expr,
2537+
true)
2538+
}
25332539
type_cname := if node.expr_type.has_flag(.option) {
25342540
'_option_${tsym.cname}'
25352541
} else {

vlib/v/gen/c/array.v

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,24 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st
170170
g.expr(node.default_expr)
171171
}
172172
} else {
173-
g.write('0')
173+
elem_sym := g.table.final_sym(node.elem_type)
174+
if elem_sym.kind == .map {
175+
info := array_type.unaliased_sym.info as ast.ArrayFixed
176+
map_info := elem_sym.map_info()
177+
g.expr(ast.MapInit{
178+
key_type: map_info.key_type
179+
value_type: map_info.value_type
180+
})
181+
for _ in 1 .. info.size {
182+
g.write(', ')
183+
g.expr(ast.MapInit{
184+
key_type: map_info.key_type
185+
value_type: map_info.value_type
186+
})
187+
}
188+
} else {
189+
g.write('0')
190+
}
174191
}
175192
g.write('}')
176193
if need_tmp_var {

vlib/v/tests/fixed_array_map_test.v

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
fn test_main() {
2+
mut arr := [22]map[string]string{}
3+
arr[0]['key'] = 'value'
4+
arr[1]['key2'] = 'value2'
5+
dump(arr[0])
6+
assert dump(arr[0]) == {
7+
'key': 'value'
8+
}
9+
assert dump(arr[1]) == {
10+
'key2': 'value2'
11+
}
12+
assert dump(arr).len == 22
13+
}

0 commit comments

Comments
 (0)