checker, cgen: fix generic fn returning fixed array (#19885)

This commit is contained in:
yuyi 2023-11-16 00:07:23 +08:00 committed by GitHub
parent 7c0aed1606
commit 915ac4ed4f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 2 deletions

View file

@ -34,6 +34,10 @@ fn (mut c Checker) return_stmt(mut node ast.Return) {
} }
} }
expected_type_sym := c.table.sym(expected_type) expected_type_sym := c.table.sym(expected_type)
if expected_type_sym.info is ast.ArrayFixed {
c.table.find_or_register_array_fixed(expected_type_sym.info.elem_type, expected_type_sym.info.size,
expected_type_sym.info.size_expr, true)
}
if node.exprs.len > 0 && c.table.cur_fn.return_type == ast.void_type { if node.exprs.len > 0 && c.table.cur_fn.return_type == ast.void_type {
c.error('unexpected argument, current function does not return anything', node.exprs[0].pos()) c.error('unexpected argument, current function does not return anything', node.exprs[0].pos())
return return

View file

@ -4896,7 +4896,7 @@ fn (mut g Gen) return_stmt(node ast.Return) {
} }
// got to do a correct check for multireturn // got to do a correct check for multireturn
sym := g.table.sym(g.fn_decl.return_type) sym := g.table.sym(g.unwrap_generic(g.fn_decl.return_type))
mut fn_ret_type := g.fn_decl.return_type mut fn_ret_type := g.fn_decl.return_type
if sym.kind == .alias { if sym.kind == .alias {
unaliased_type := g.table.unaliased_type(fn_ret_type) unaliased_type := g.table.unaliased_type(fn_ret_type)

View file

@ -227,7 +227,7 @@ fn (mut g Gen) gen_fn_decl(node &ast.FnDecl, skip bool) {
mut name := g.c_fn_name(node) mut name := g.c_fn_name(node)
mut type_name := g.typ(g.unwrap_generic(node.return_type)) mut type_name := g.typ(g.unwrap_generic(node.return_type))
ret_sym := g.table.sym(node.return_type) ret_sym := g.table.sym(g.unwrap_generic(node.return_type))
if node.return_type.has_flag(.generic) && ret_sym.kind == .array_fixed { if node.return_type.has_flag(.generic) && ret_sym.kind == .array_fixed {
type_name = '_v_${type_name}' type_name = '_v_${type_name}'
} else if ret_sym.kind == .alias && !node.return_type.has_flag(.option) { } else if ret_sym.kind == .alias && !node.return_type.has_flag(.option) {

View file

@ -0,0 +1,9 @@
fn init_type[T]() T {
return T{}
}
fn test_generics_return_fixed_array() {
r1 := init_type[[3]int]()
println(r1)
assert '${r1}' == '[0, 0, 0]'
}