checker: fix type error in `f<T>(fn (v T))` with multiple different Ts (#10154)
parent
f7cd95472a
commit
be92f81b2e
|
@ -1211,6 +1211,7 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
|
||||||
func.return_type = typ
|
func.return_type = typ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func.params = func.params.clone()
|
||||||
for mut param in func.params {
|
for mut param in func.params {
|
||||||
if param.typ.has_flag(.generic) {
|
if param.typ.has_flag(.generic) {
|
||||||
if typ := t.resolve_generic_to_concrete(param.typ, generic_names, concrete_types,
|
if typ := t.resolve_generic_to_concrete(param.typ, generic_names, concrete_types,
|
||||||
|
|
|
@ -24,6 +24,14 @@ pub fn consume(data int) int {
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn consume_str(data string) string {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
fn call<T>(f fn (T) T, v T) T {
|
||||||
|
return f(v)
|
||||||
|
}
|
||||||
|
|
||||||
fn test_generics_with_anon_generics_fn() {
|
fn test_generics_with_anon_generics_fn() {
|
||||||
mut s := MyStruct<int>{
|
mut s := MyStruct<int>{
|
||||||
arr: [1, 2, 3, 4, 5]
|
arr: [1, 2, 3, 4, 5]
|
||||||
|
@ -31,4 +39,9 @@ fn test_generics_with_anon_generics_fn() {
|
||||||
y := s.iterate<int>(consume)
|
y := s.iterate<int>(consume)
|
||||||
println(y)
|
println(y)
|
||||||
assert y == 15
|
assert y == 15
|
||||||
|
|
||||||
|
assert call<int>(consume, 1) == 1
|
||||||
|
assert call<string>(consume_str, '1') == '1'
|
||||||
|
assert call(consume, 1) == 1
|
||||||
|
assert call(consume_str, '1') == '1'
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue