Skip to content

Commit ac62317

Browse files
authored
cgen: fix multiple fixed array variable init (fix #20895) (#20902)
1 parent ee045ed commit ac62317

File tree

4 files changed

+67
-13
lines changed

4 files changed

+67
-13
lines changed

vlib/v/gen/c/array.v

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) {
5656
} else if elem_type.unaliased_sym.kind == .array_fixed
5757
&& expr in [ast.Ident, ast.SelectorExpr] {
5858
info := elem_type.unaliased_sym.info as ast.ArrayFixed
59-
g.fixed_array_var_init(expr, info.size)
59+
g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(),
60+
info.elem_type, info.size)
6061
} else {
6162
g.expr_with_cast(expr, node.expr_types[i], node.elem_type)
6263
}
@@ -162,7 +163,8 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st
162163
for i, expr in node.exprs {
163164
if elem_sym.kind == .array_fixed && expr in [ast.Ident, ast.SelectorExpr] {
164165
info := elem_sym.info as ast.ArrayFixed
165-
g.fixed_array_var_init(expr, info.size)
166+
g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(),
167+
info.elem_type, info.size)
166168
} else {
167169
if expr.is_auto_deref_var() {
168170
g.write('*')
@@ -1339,17 +1341,23 @@ fn (mut g Gen) write_prepared_var(var_name string, inp_info ast.Array, inp_elem_
13391341
}
13401342
}
13411343

1342-
fn (mut g Gen) fixed_array_var_init(expr ast.Expr, size int) {
1344+
fn (mut g Gen) fixed_array_var_init(expr_str string, is_auto_deref bool, elem_type ast.Type, size int) {
13431345
g.write('{')
13441346
for i in 0 .. size {
1345-
if expr.is_auto_deref_var() {
1346-
g.write('(*')
1347-
}
1348-
g.expr(expr)
1349-
if expr.is_auto_deref_var() {
1350-
g.write(')')
1347+
elem_sym := g.table.sym(elem_type)
1348+
if elem_sym.info is ast.ArrayFixed {
1349+
g.fixed_array_var_init('${expr_str}[${i}]', is_auto_deref, elem_sym.info.elem_type,
1350+
elem_sym.info.size)
1351+
} else {
1352+
if is_auto_deref {
1353+
g.write('(*')
1354+
}
1355+
g.write(expr_str)
1356+
if is_auto_deref {
1357+
g.write(')')
1358+
}
1359+
g.write('[${i}]')
13511360
}
1352-
g.write('[${i}]')
13531361
if i != size - 1 {
13541362
g.write(', ')
13551363
}

vlib/v/gen/c/cgen.v

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5397,7 +5397,9 @@ fn (mut g Gen) return_stmt(node ast.Return) {
53975397
}
53985398
for i, expr in node.exprs {
53995399
if return_sym.kind == .array_fixed && expr !is ast.ArrayInit {
5400-
g.fixed_array_var_init(expr, (return_sym.info as ast.ArrayFixed).size)
5400+
info := return_sym.info as ast.ArrayFixed
5401+
g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(),
5402+
info.elem_type, info.size)
54015403
} else {
54025404
g.expr_with_cast(expr, node.types[i], fn_ret_type.clear_option_and_result())
54035405
}
@@ -5432,7 +5434,9 @@ fn (mut g Gen) return_stmt(node ast.Return) {
54325434
if fn_ret_type.has_flag(.option) {
54335435
g.expr_with_opt(expr, node.types[i], fn_ret_type.clear_flag(.result))
54345436
} else if return_sym.kind == .array_fixed && expr !is ast.ArrayInit {
5435-
g.fixed_array_var_init(expr, (return_sym.info as ast.ArrayFixed).size)
5437+
info := return_sym.info as ast.ArrayFixed
5438+
g.fixed_array_var_init(g.expr_string(expr), expr.is_auto_deref_var(),
5439+
info.elem_type, info.size)
54365440
} else {
54375441
g.expr_with_cast(expr, node.types[i], fn_ret_type.clear_flag(.result))
54385442
}

vlib/v/gen/c/struct.v

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,8 @@ fn (mut g Gen) struct_init_field(sfield ast.StructInitField, language ast.Langua
603603
field_unwrap_sym := g.table.sym(g.unwrap_generic(sfield.typ))
604604
if field_unwrap_sym.kind == .array_fixed && sfield.expr in [ast.Ident, ast.SelectorExpr] {
605605
info := field_unwrap_sym.info as ast.ArrayFixed
606-
g.fixed_array_var_init(sfield.expr, info.size)
606+
g.fixed_array_var_init(g.expr_string(sfield.expr), sfield.expr.is_auto_deref_var(),
607+
info.elem_type, info.size)
607608
} else {
608609
if sfield.typ != ast.voidptr_type && sfield.typ != ast.nil_type
609610
&& (sfield.expected_type.is_ptr() && !sfield.expected_type.has_flag(.shared_f))
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
struct Cell {
2+
value int
3+
fvalue f32
4+
mut:
5+
mut_value int = 10
6+
mut_fvalue f32
7+
}
8+
9+
struct Grid {
10+
cells [2][2][2]Cell
11+
}
12+
13+
fn test_multiple_fixed_array_var_init() {
14+
mut tile_field := [2][2][2]Cell{}
15+
16+
b := Grid{
17+
cells: tile_field
18+
}
19+
20+
println('The original:')
21+
println(tile_field)
22+
println('==========')
23+
println('The struct:')
24+
println(b.cells)
25+
assert b.cells[0][0][0].value == 0
26+
assert b.cells[0][0][0].mut_value == 10
27+
assert b.cells[0][0][1].value == 0
28+
assert b.cells[0][0][1].mut_value == 10
29+
assert b.cells[0][1][0].value == 0
30+
assert b.cells[0][1][0].mut_value == 10
31+
assert b.cells[0][1][1].value == 0
32+
assert b.cells[0][1][1].mut_value == 10
33+
assert b.cells[1][0][0].value == 0
34+
assert b.cells[1][0][0].mut_value == 10
35+
assert b.cells[1][0][1].value == 0
36+
assert b.cells[1][0][1].mut_value == 10
37+
assert b.cells[1][1][0].value == 0
38+
assert b.cells[1][1][0].mut_value == 10
39+
assert b.cells[1][1][1].value == 0
40+
assert b.cells[1][1][1].mut_value == 10
41+
}

0 commit comments

Comments
 (0)