From 1a6f07dda53311dc79d648eec880219cee839bc7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 21 Nov 2025 00:57:55 -0300 Subject: [PATCH] checker: fix array fixed unresolved return check and resolver (fix #25774) (#25790) --- vlib/v/checker/checker.v | 6 ++++++ vlib/v/checker/return.v | 5 +++++ vlib/v/gen/c/cgen.v | 4 ++-- .../tests/fns/array_fixed_unresolved_ret_test.v | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/fns/array_fixed_unresolved_ret_test.v diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index a54212da7..525b0cc85 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -5913,7 +5913,13 @@ pub fn (mut c Checker) update_unresolved_fixed_sizes() { ret_sym := c.table.sym(stmt.return_type) if ret_sym.info is ast.ArrayFixed && c.array_fixed_has_unresolved_size(ret_sym.info) { mut size_expr := ret_sym.info.size_expr + old_typ := c.cast_fixed_array_ret(stmt.return_type, c.table.final_sym(stmt.return_type)) stmt.return_type = c.eval_array_fixed_sizes(mut size_expr, 0, ret_sym.info.elem_type) + new_sym := c.table.sym(stmt.return_type) + mut typ_sym := c.table.type_symbols[old_typ.idx()] + typ_sym.name = new_sym.name + typ_sym.cname = new_sym.cname + typ_sym.info = new_sym.info } } else if mut stmt is ast.TypeDecl { // alias mut alias_decl := stmt diff --git a/vlib/v/checker/return.v b/vlib/v/checker/return.v index e8b9614ab..463762277 100644 --- a/vlib/v/checker/return.v +++ b/vlib/v/checker/return.v @@ -278,6 +278,11 @@ fn (mut c Checker) return_stmt(mut node ast.Return) { if c.inside_lambda && exp_type.has_flag(.generic) { continue } + if exp_final_sym.info is ast.ArrayFixed + && c.array_fixed_has_unresolved_size(exp_final_sym.info) { + continue + } + c.error('cannot use `${got_type_name}` as ${c.error_type_name(exp_type)} in return argument', exprv.pos()) } diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index f4e9a83b9..d462e58e5 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -7034,8 +7034,8 @@ fn (mut g Gen) write_types(symbols []&ast.TypeSymbol) { ast.ArrayFixed { elem_sym := g.table.sym(sym.info.elem_type) if !elem_sym.is_builtin() && !sym.info.elem_type.has_flag(.generic) - && (!g.pref.skip_unused || (!sym.info.is_fn_ret - && sym.idx in g.table.used_features.used_syms)) { + && !sym.info.is_fn_ret && (!g.pref.skip_unused + || (!sym.info.is_fn_ret && sym.idx in g.table.used_features.used_syms)) { // .array_fixed { styp := sym.cname // array_fixed_char_300 => char x[300] diff --git a/vlib/v/tests/fns/array_fixed_unresolved_ret_test.v b/vlib/v/tests/fns/array_fixed_unresolved_ret_test.v new file mode 100644 index 000000000..320f75938 --- /dev/null +++ b/vlib/v/tests/fns/array_fixed_unresolved_ret_test.v @@ -0,0 +1,17 @@ +enum Abc { + a = 1 + b = 2 + c = 3 +} + +const abc_len = int(Abc.c) + +fn build_arr() [abc_len]Abc { + return [abc_len]Abc{} +} + +fn test_main() { + a := build_arr() + println(a) + assert a.len == 3 +} -- 2.39.5