checker: fix generic fn return array of generic struct (#12170)
parent
d373eba79b
commit
97e999768a
|
@ -685,6 +685,20 @@ fn (mut c Checker) unwrap_generic_type(typ ast.Type, generic_names []string, con
|
|||
mut c_nrt := ''
|
||||
ts := c.table.get_type_symbol(typ)
|
||||
match mut ts.info {
|
||||
ast.Array {
|
||||
mut elem_type := ts.info.elem_type
|
||||
mut elem_sym := c.table.get_type_symbol(elem_type)
|
||||
mut dims := 1
|
||||
for mut elem_sym.info is ast.Array {
|
||||
info := elem_sym.info as ast.Array
|
||||
elem_type = info.elem_type
|
||||
elem_sym = c.table.get_type_symbol(elem_type)
|
||||
dims++
|
||||
}
|
||||
unwrap_typ := c.unwrap_generic_type(elem_type, generic_names, concrete_types)
|
||||
idx := c.table.find_or_register_array_with_dims(unwrap_typ, dims)
|
||||
return ast.new_type(idx).derive_add_muls(typ).clear_flag(.generic)
|
||||
}
|
||||
ast.Struct, ast.Interface, ast.SumType {
|
||||
if !ts.info.is_generic {
|
||||
return typ
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
pub struct Abcd<T> {
|
||||
}
|
||||
|
||||
pub fn iterators<T>() []&Abcd<T> {
|
||||
return []&Abcd<T>{}
|
||||
}
|
||||
|
||||
fn test_generic_fn_return_array_of_generic_struct() {
|
||||
a := iterators<f64>()
|
||||
println(a)
|
||||
assert '$a' == '[]'
|
||||
}
|
Loading…
Reference in New Issue