From 9cd1bce6a448b862e75b1b1464f79c1cc2537e68 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 11 Jan 2025 14:30:57 -0300 Subject: [PATCH] cgen: fix array of sumtype initialization with var string (fix #23429) (#23432) --- vlib/v/gen/c/array.v | 12 ++++++++--- .../builtin_arrays/array_sumtype_init_test.v | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/builtin_arrays/array_sumtype_init_test.v diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index 208a96af1..0e6944859 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -23,6 +23,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) { g.write('HEAP(${array_styp}, ') } len := node.exprs.len + elem_sym := g.table.sym(g.unwrap_generic(node.elem_type)) if array_type.unaliased_sym.kind == .array_fixed { g.fixed_array_init(node, array_type, var_name, is_amp) if is_amp { @@ -44,12 +45,17 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) { g.writeln('') g.write('\t\t') } + is_sumtype := elem_sym.kind == .sum_type for i, expr in node.exprs { if node.expr_types[i] == ast.string_type && expr !in [ast.IndexExpr, ast.CallExpr, ast.StringLiteral, ast.StringInterLiteral, ast.InfixExpr] { - g.write('string_clone(') - g.expr(expr) - g.write(')') + if is_sumtype { + g.expr_with_cast(expr, node.expr_types[i], node.elem_type) + } else { + g.write('string_clone(') + g.expr(expr) + g.write(')') + } } else { if node.elem_type.has_flag(.option) { g.expr_with_opt(expr, node.expr_types[i], node.elem_type) diff --git a/vlib/v/tests/builtin_arrays/array_sumtype_init_test.v b/vlib/v/tests/builtin_arrays/array_sumtype_init_test.v new file mode 100644 index 000000000..73e418ece --- /dev/null +++ b/vlib/v/tests/builtin_arrays/array_sumtype_init_test.v @@ -0,0 +1,21 @@ +type SumFoo = int | string + +struct Foo { + bar []SumFoo +} + +struct Bar { + foo []Foo +} + +fn test_main() { + str := 'foobar' + f := Bar{ + foo: [Foo{ + bar: [str] + }] + } + assert f.foo.len == 1 + assert f.foo[0].bar.len == 1 + assert f.foo[0].bar[0] as string == str +} -- 2.39.5