Skip to content

Commit 1a6f07d

Browse files
authored
checker: fix array fixed unresolved return check and resolver (fix #25774) (#25790)
1 parent 73cc802 commit 1a6f07d

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

vlib/v/checker/checker.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5913,7 +5913,13 @@ pub fn (mut c Checker) update_unresolved_fixed_sizes() {
59135913
ret_sym := c.table.sym(stmt.return_type)
59145914
if ret_sym.info is ast.ArrayFixed && c.array_fixed_has_unresolved_size(ret_sym.info) {
59155915
mut size_expr := ret_sym.info.size_expr
5916+
old_typ := c.cast_fixed_array_ret(stmt.return_type, c.table.final_sym(stmt.return_type))
59165917
stmt.return_type = c.eval_array_fixed_sizes(mut size_expr, 0, ret_sym.info.elem_type)
5918+
new_sym := c.table.sym(stmt.return_type)
5919+
mut typ_sym := c.table.type_symbols[old_typ.idx()]
5920+
typ_sym.name = new_sym.name
5921+
typ_sym.cname = new_sym.cname
5922+
typ_sym.info = new_sym.info
59175923
}
59185924
} else if mut stmt is ast.TypeDecl { // alias
59195925
mut alias_decl := stmt

vlib/v/checker/return.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,11 @@ fn (mut c Checker) return_stmt(mut node ast.Return) {
278278
if c.inside_lambda && exp_type.has_flag(.generic) {
279279
continue
280280
}
281+
if exp_final_sym.info is ast.ArrayFixed
282+
&& c.array_fixed_has_unresolved_size(exp_final_sym.info) {
283+
continue
284+
}
285+
281286
c.error('cannot use `${got_type_name}` as ${c.error_type_name(exp_type)} in return argument',
282287
exprv.pos())
283288
}

vlib/v/gen/c/cgen.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7034,8 +7034,8 @@ fn (mut g Gen) write_types(symbols []&ast.TypeSymbol) {
70347034
ast.ArrayFixed {
70357035
elem_sym := g.table.sym(sym.info.elem_type)
70367036
if !elem_sym.is_builtin() && !sym.info.elem_type.has_flag(.generic)
7037-
&& (!g.pref.skip_unused || (!sym.info.is_fn_ret
7038-
&& sym.idx in g.table.used_features.used_syms)) {
7037+
&& !sym.info.is_fn_ret && (!g.pref.skip_unused
7038+
|| (!sym.info.is_fn_ret && sym.idx in g.table.used_features.used_syms)) {
70397039
// .array_fixed {
70407040
styp := sym.cname
70417041
// array_fixed_char_300 => char x[300]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
enum Abc {
2+
a = 1
3+
b = 2
4+
c = 3
5+
}
6+
7+
const abc_len = int(Abc.c)
8+
9+
fn build_arr() [abc_len]Abc {
10+
return [abc_len]Abc{}
11+
}
12+
13+
fn test_main() {
14+
a := build_arr()
15+
println(a)
16+
assert a.len == 3
17+
}

0 commit comments

Comments
 (0)