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 := ''
|
mut c_nrt := ''
|
||||||
ts := c.table.get_type_symbol(typ)
|
ts := c.table.get_type_symbol(typ)
|
||||||
match mut ts.info {
|
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 {
|
ast.Struct, ast.Interface, ast.SumType {
|
||||||
if !ts.info.is_generic {
|
if !ts.info.is_generic {
|
||||||
return typ
|
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