diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index 58c01b34a2e2e6..ed54d87696c811 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -20,14 +20,27 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) { g.writeln('(${shared_styp}*)__dup_shared_array(&(${shared_styp}){.mtx = {0}, .val =') } else if is_amp { array_styp = g.styp(array_type.typ) - g.write('HEAP(${array_styp}, ') + if node.is_fixed && !g.inside_global_decl { + line := g.go_before_last_stmt() + tmp_var := g.new_tmp_var() + g.write('${array_styp} ${tmp_var} = ') + g.fixed_array_init(node, array_type, var_name, is_amp) + g.writeln(';') + g.write(line) + + g.write('builtin__memdup((void*)&${tmp_var}, sizeof(${array_styp}))') + } else { + g.write('HEAP(${array_styp}, ') + } } len := node.exprs.len elem_sym := g.table.sym(g.unwrap_generic(node.elem_type)) if node.is_fixed || array_type.unaliased_sym.kind == .array_fixed { - g.fixed_array_init(node, array_type, var_name, is_amp) - if is_amp { - g.write(')') + if !(is_amp && !g.inside_global_decl) { + g.fixed_array_init(node, array_type, var_name, is_amp) + if is_amp { + g.write(')') + } } } else if len == 0 { // `[]int{len: 6, cap:10, init:22}` diff --git a/vlib/v/tests/pointers/ref_array_init_test.v b/vlib/v/tests/pointers/ref_array_init_test.v index 15c28a043f7278..73b66bfb2bfa8a 100644 --- a/vlib/v/tests/pointers/ref_array_init_test.v +++ b/vlib/v/tests/pointers/ref_array_init_test.v @@ -1,5 +1,8 @@ fn test_reference_array_init() { mut b := &[5, 6, 7] + assert '${b}' == '&[5, 6, 7]' + mut b_fixed := &[5, 6, 7]! + assert '${b_fixed}' == '&[5, 6, 7]' { mut a := [1, 2, 3] // TODO: this should probably produce a notice at least, @@ -7,7 +10,9 @@ fn test_reference_array_init() { // on the stack, that will very soon be out of scope, even // though it is still in the same function: b = &a + b_fixed = &[1, 2, 3]! } println(b) assert '${b}' == '&[1, 2, 3]' + assert '${b_fixed}' == '&[1, 2, 3]' }