checker: fix generic array.map with generic callback fn (#11991)
parent
2ee873d6ca
commit
d6a4bce2ef
|
@ -2683,7 +2683,7 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as
|
||||||
ast.FnType { arg_sym.info.func.return_type }
|
ast.FnType { arg_sym.info.func.return_type }
|
||||||
else { arg_type }
|
else { arg_type }
|
||||||
}
|
}
|
||||||
node.return_type = c.table.find_or_register_array(ret_type)
|
node.return_type = c.table.find_or_register_array(c.unwrap_generic(ret_type))
|
||||||
} else if method_name == 'filter' {
|
} else if method_name == 'filter' {
|
||||||
// check fn
|
// check fn
|
||||||
c.check_map_and_filter(false, elem_typ, node)
|
c.check_map_and_filter(false, elem_typ, node)
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
fn test_generics_array_map_with_generic_callback() {
|
||||||
|
mut a := []Sth{}
|
||||||
|
a = arr_generic<Sth>(buggy_cb)
|
||||||
|
println(a)
|
||||||
|
assert a.len == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn arr_generic<T>(cb fn (int) T) []T {
|
||||||
|
return []int{}.map(cb(it))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn buggy_cb(a int) Sth {
|
||||||
|
return Sth{
|
||||||
|
a: a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Sth {
|
||||||
|
a int
|
||||||
|
b string
|
||||||
|
}
|
Loading…
Reference in New Issue