Skip to content

Commit d5dba2d

Browse files
authored
cgen: fix dumping for a pointer to a fixed array initialization with prefixexpr & (fix #20344)
1 parent 1ca808c commit d5dba2d

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

vlib/v/gen/c/array.v

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) {
2424
}
2525
len := node.exprs.len
2626
if array_type.unaliased_sym.kind == .array_fixed {
27-
g.fixed_array_init(node, array_type, var_name)
27+
g.fixed_array_init(node, array_type, var_name, is_amp)
2828
if is_amp {
2929
g.write(')')
3030
}
@@ -79,7 +79,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit, var_name string) {
7979
}
8080
}
8181

82-
fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name string) {
82+
fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name string, is_amp bool) {
8383
prev_inside_lambda := g.inside_lambda
8484
g.inside_lambda = true
8585
defer {
@@ -177,6 +177,8 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st
177177
g.write(', ')
178178
}
179179
}
180+
} else if is_amp {
181+
g.write('0')
180182
} else {
181183
elem_sym := g.table.final_sym(node.elem_type)
182184
if elem_sym.kind == .map {

vlib/v/gen/c/dumpexpr.v

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,13 @@ fn (mut g Gen) dump_expr_definitions() {
210210
surrounder.builder_write_afters(mut dump_fns)
211211
if is_fixed_arr_ret {
212212
tmp_var := g.new_tmp_var()
213-
dump_fns.writeln('\t${str_dumparg_ret_type} ${tmp_var} = {0};')
214-
dump_fns.writeln('\tmemcpy(${tmp_var}.ret_arr, dump_arg, sizeof(${str_dumparg_type}));')
213+
if typ.is_ptr() {
214+
dump_fns.writeln('\t${str_dumparg_ret_type} ${tmp_var} = HEAP(${g.typ(typ.set_nr_muls(0))}, {0});')
215+
dump_fns.writeln('\tmemcpy(${tmp_var}->ret_arr, dump_arg, sizeof(${str_dumparg_type}));')
216+
} else {
217+
dump_fns.writeln('\t${str_dumparg_ret_type} ${tmp_var} = {0};')
218+
dump_fns.writeln('\tmemcpy(${tmp_var}.ret_arr, dump_arg, sizeof(${str_dumparg_type}));')
219+
}
215220
dump_fns.writeln('\treturn ${tmp_var};')
216221
} else {
217222
dump_fns.writeln('\treturn dump_arg;')

vlib/v/tests/array_fixed_ptr_test.v

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
fn test_main() {
2+
a := &[2]u8{}
3+
dump(a)
4+
assert a.len == 2
5+
}
6+
7+
fn test_empty() {
8+
_ := &[2]u8{}
9+
10+
assert true
11+
}

0 commit comments

Comments
 (0)