diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index 8dc4a49655d7ce..e9dca00ce3c06e 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -56,7 +56,8 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) { } else if elem_type.unaliased_sym.kind == .array_fixed && expr in [ast.Ident, ast.SelectorExpr] { info := elem_type.unaliased_sym.info as ast.ArrayFixed - g.fixed_array_var_init(expr, info.size) + g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(), + info.elem_type, info.size) } else { g.expr_with_cast(expr, node.expr_types[i], node.elem_type) } @@ -162,7 +163,8 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st for i, expr in node.exprs { if elem_sym.kind == .array_fixed && expr in [ast.Ident, ast.SelectorExpr] { info := elem_sym.info as ast.ArrayFixed - g.fixed_array_var_init(expr, info.size) + g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(), + info.elem_type, info.size) } else { if expr.is_auto_deref_var() { g.write('*') @@ -1339,17 +1341,23 @@ fn (mut g Gen) write_prepared_var(var_name string, inp_info ast.Array, inp_elem_ } } -fn (mut g Gen) fixed_array_var_init(expr ast.Expr, size int) { +fn (mut g Gen) fixed_array_var_init(expr_str string, is_auto_deref bool, elem_type ast.Type, size int) { g.write('{') for i in 0 .. size { - if expr.is_auto_deref_var() { - g.write('(*') - } - g.expr(expr) - if expr.is_auto_deref_var() { - g.write(')') + elem_sym := g.table.sym(elem_type) + if elem_sym.info is ast.ArrayFixed { + g.fixed_array_var_init('${expr_str}[${i}]', is_auto_deref, elem_sym.info.elem_type, + elem_sym.info.size) + } else { + if is_auto_deref { + g.write('(*') + } + g.write(expr_str) + if is_auto_deref { + g.write(')') + } + g.write('[${i}]') } - g.write('[${i}]') if i != size - 1 { g.write(', ') } diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index f2b13da2abd723..a6e103ce16bde0 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -5397,7 +5397,9 @@ fn (mut g Gen) return_stmt(node ast.Return) { } for i, expr in node.exprs { if return_sym.kind == .array_fixed && expr !is ast.ArrayInit { - g.fixed_array_var_init(expr, (return_sym.info as ast.ArrayFixed).size) + info := return_sym.info as ast.ArrayFixed + g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(), + info.elem_type, info.size) } else { g.expr_with_cast(expr, node.types[i], fn_ret_type.clear_option_and_result()) } @@ -5432,7 +5434,9 @@ fn (mut g Gen) return_stmt(node ast.Return) { if fn_ret_type.has_flag(.option) { g.expr_with_opt(expr, node.types[i], fn_ret_type.clear_flag(.result)) } else if return_sym.kind == .array_fixed && expr !is ast.ArrayInit { - g.fixed_array_var_init(expr, (return_sym.info as ast.ArrayFixed).size) + info := return_sym.info as ast.ArrayFixed + g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(), + info.elem_type, info.size) } else { g.expr_with_cast(expr, node.types[i], fn_ret_type.clear_flag(.result)) } diff --git a/vlib/v/gen/c/struct.v b/vlib/v/gen/c/struct.v index 35e1d7c61a6bbb..818f030fc03424 100644 --- a/vlib/v/gen/c/struct.v +++ b/vlib/v/gen/c/struct.v @@ -603,7 +603,8 @@ fn (mut g Gen) struct_init_field(sfield ast.StructInitField, language ast.Langua field_unwrap_sym := g.table.sym(g.unwrap_generic(sfield.typ)) if field_unwrap_sym.kind == .array_fixed && sfield.expr in [ast.Ident, ast.SelectorExpr] { info := field_unwrap_sym.info as ast.ArrayFixed - g.fixed_array_var_init(sfield.expr, info.size) + g.fixed_array_var_init(g.expr_string(sfield.expr), sfield.expr.is_auto_deref_var(), + info.elem_type, info.size) } else { if sfield.typ != ast.voidptr_type && sfield.typ != ast.nil_type && (sfield.expected_type.is_ptr() && !sfield.expected_type.has_flag(.shared_f)) diff --git a/vlib/v/tests/multiple_fixed_array_var_init_test.v b/vlib/v/tests/multiple_fixed_array_var_init_test.v new file mode 100644 index 00000000000000..aff032d044acd9 --- /dev/null +++ b/vlib/v/tests/multiple_fixed_array_var_init_test.v @@ -0,0 +1,41 @@ +struct Cell { + value int + fvalue f32 +mut: + mut_value int = 10 + mut_fvalue f32 +} + +struct Grid { + cells [2][2][2]Cell +} + +fn test_multiple_fixed_array_var_init() { + mut tile_field := [2][2][2]Cell{} + + b := Grid{ + cells: tile_field + } + + println('The original:') + println(tile_field) + println('==========') + println('The struct:') + println(b.cells) + assert b.cells[0][0][0].value == 0 + assert b.cells[0][0][0].mut_value == 10 + assert b.cells[0][0][1].value == 0 + assert b.cells[0][0][1].mut_value == 10 + assert b.cells[0][1][0].value == 0 + assert b.cells[0][1][0].mut_value == 10 + assert b.cells[0][1][1].value == 0 + assert b.cells[0][1][1].mut_value == 10 + assert b.cells[1][0][0].value == 0 + assert b.cells[1][0][0].mut_value == 10 + assert b.cells[1][0][1].value == 0 + assert b.cells[1][0][1].mut_value == 10 + assert b.cells[1][1][0].value == 0 + assert b.cells[1][1][0].mut_value == 10 + assert b.cells[1][1][1].value == 0 + assert b.cells[1][1][1].mut_value == 10 +}