From a985192da8000d24d9e4c7e971d8bb4a06ac00e9 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Sun, 4 Jan 2026 15:51:53 +0800 Subject: [PATCH] cgen: fix multi dim fixed array with opt elem (fix #26243) (#26258) --- vlib/v/gen/c/array.v | 25 +++++++++++++++++-- .../testdata/fixed_arr_multi_dim_opt_elem.out | 1 + .../testdata/fixed_arr_multi_dim_opt_elem.vv | 2 ++ .../fixed_arr_multi_dim_opt_elem_markused.out | 1 + .../fixed_arr_multi_dim_opt_elem_markused.vv | 2 ++ vlib/v/markused/walker.v | 3 +++ 6 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.out create mode 100644 vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.vv create mode 100644 vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.out create mode 100644 vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.vv diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index 705e4286b..3600f5316 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -236,7 +236,6 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st } else if elem_sym.kind == .array_fixed { // nested fixed array -- [N][N]type arr_info := elem_sym.array_fixed_info() - before_arr_expr_pos := g.out.len { g.expr(ast.ArrayInit{ exprs: [ast.IntegerLiteral{}] @@ -244,7 +243,7 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st elem_type: arr_info.elem_type }) } - sarr_expr := g.out.cut_to(before_arr_expr_pos) + sarr_expr := g.cut_and_get_fixed_array_init_elements() g.write_c99_elements_for_array(array_info.size, sarr_expr) } else if elem_sym.kind == .chan { // fixed array for chan -- [N]chan @@ -280,6 +279,28 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st } } +// cut_and_get_fixed_array_init_elements +// for `Array_fixed_Array_fixed_Array_fixed__option_int_2_2_2 a = {{ _t1, _t2}` +// will cut to `=` and return `{ _t1, _t2}` +@[direct_array_access] +fn (mut g Gen) cut_and_get_fixed_array_init_elements() string { + // extract the `{{},{}}` string + mut nested_level := 0 + for i := g.out.len - 1; i >= 0; i-- { + if g.out[i] == `}` { + nested_level++ + } else if g.out[i] == `{` { + nested_level-- + } else if g.out[i] == ` ` { + continue + } + if nested_level == 0 { + return g.out.cut_to(i) + } + } + return '/*this should not happend*/' +} + fn (mut g Gen) expr_with_init(node ast.ArrayInit) { if node.elem_type.has_flag(.option) { g.expr_with_opt(node.init_expr, node.init_type, node.elem_type) diff --git a/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.out b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.out new file mode 100644 index 000000000..8cad20e12 --- /dev/null +++ b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.out @@ -0,0 +1 @@ +[[[Option(none), Option(none)], [Option(none), Option(none)], [Option(none), Option(none)]], [[Option(none), Option(none)], [Option(none), Option(none)], [Option(none), Option(none)]]] diff --git a/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.vv b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.vv new file mode 100644 index 000000000..a4878b5fc --- /dev/null +++ b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem.vv @@ -0,0 +1,2 @@ +a := [2][3][2]?int{} +println(a) diff --git a/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.out b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.out new file mode 100644 index 000000000..19f86f493 --- /dev/null +++ b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.out @@ -0,0 +1 @@ +done diff --git a/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.vv b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.vv new file mode 100644 index 000000000..a37c4296f --- /dev/null +++ b/vlib/v/gen/c/testdata/fixed_arr_multi_dim_opt_elem_markused.vv @@ -0,0 +1,2 @@ +_ := [2][3]?int{} +println('done') diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index b7d3bbd5a..166525ed7 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -1247,6 +1247,9 @@ pub fn (mut w Walker) mark_by_sym(isym ast.TypeSymbol) { if !w.uses_array && !w.is_direct_array_access { w.uses_array = true } + if isym.info.elem_type.has_flag(.option) { + w.used_option++ + } w.mark_by_type(isym.info.elem_type) } ast.SumType { -- 2.39.5