diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 0cf4c8a8a4bc05..38bd0e007fc358 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -6248,7 +6248,13 @@ fn (mut g Gen) const_decl_init_later_msvc_string_fixed_array(mod string, name st cname := g.c_const_name(name) mut init := strings.new_builder(100) for i, elem_expr in expr.exprs { - init.writeln(g.expr_string_surround('\t${cname}[${i}] = ', elem_expr, ';')) + if elem_expr is ast.ArrayInit && elem_expr.is_fixed { + elem_typ := g.typ(elem_expr.typ) + init.writeln(g.expr_string_surround('\tmemcpy(${cname}[${i}], (${elem_typ})', + elem_expr, ', sizeof(${elem_typ}));')) + } else { + init.writeln(g.expr_string_surround('\t${cname}[${i}] = ', elem_expr, ';')) + } } mut def := '${styp} ${cname}' g.global_const_defs[util.no_dots(name)] = GlobalConstDef{ diff --git a/vlib/v/tests/consts/const_array_fixed_test.v b/vlib/v/tests/consts/const_array_fixed_test.v new file mode 100644 index 00000000000000..aedaae3c8db4d0 --- /dev/null +++ b/vlib/v/tests/consts/const_array_fixed_test.v @@ -0,0 +1,32 @@ +@[has_globals] +module main + +struct Foo { + bar int = 120 +} + +__global ( + a Foo +) + +const c = [[a.bar]!]! +const d = [[a.bar]]! +const e = [[a.bar]!] +const f = [[[a.bar]!]!]! +const g = [a.bar] + +fn test_selector() { + assert dump(c == [[a.bar]!]!) + assert dump(d == [[a.bar]]!) + assert dump(e == [[a.bar]!]) + assert dump(f == [[[a.bar]!]!]!) + assert dump(g == [a.bar]) +} + +fn test_literal() { + assert dump(c == [[120]!]!) + assert dump(d == [[120]]!) + assert dump(e == [[120]!]) + assert dump(f == [[[120]!]!]!) + assert dump(g == [120]) +}