checker: fix generics with generic anon fn parameter (#10101)
parent
4273a9697e
commit
b728d89069
|
@ -508,15 +508,13 @@ pub fn (mut c Checker) infer_fn_generic_types(f ast.Fn, mut call_expr ast.CallEx
|
||||||
|
|
||||||
if param.typ.has_flag(.generic) && param_type_sym.name == gt_name {
|
if param.typ.has_flag(.generic) && param_type_sym.name == gt_name {
|
||||||
to_set = c.table.mktyp(arg.typ)
|
to_set = c.table.mktyp(arg.typ)
|
||||||
mut sym := c.table.get_type_symbol(arg.typ)
|
sym := c.table.get_type_symbol(arg.typ)
|
||||||
if mut sym.info is ast.FnType {
|
if sym.info is ast.FnType {
|
||||||
if !sym.info.is_anon {
|
mut func := sym.info.func
|
||||||
sym.info.func.name = ''
|
func.name = ''
|
||||||
idx := c.table.find_or_register_fn_type(c.mod, sym.info.func,
|
idx := c.table.find_or_register_fn_type(c.mod, func, true, false)
|
||||||
true, false)
|
|
||||||
to_set = ast.new_type(idx).derive(arg.typ)
|
to_set = ast.new_type(idx).derive(arg.typ)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if arg.expr.is_auto_deref_var() {
|
if arg.expr.is_auto_deref_var() {
|
||||||
to_set = to_set.deref()
|
to_set = to_set.deref()
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,3 +58,48 @@ fn test_generics_with_generics_fn_return_type() {
|
||||||
f = mixed_v2(neg)
|
f = mixed_v2(neg)
|
||||||
assert f(7) == -7
|
assert f(7) == -7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn neg_a(a int) int {
|
||||||
|
return -a
|
||||||
|
}
|
||||||
|
|
||||||
|
fn neg_b(b int) int {
|
||||||
|
return -b
|
||||||
|
}
|
||||||
|
|
||||||
|
// assume that "generic" is a heavy function and should be shared
|
||||||
|
// by *all* callers in this file
|
||||||
|
[noinline]
|
||||||
|
fn generic<T>(func T) T {
|
||||||
|
return func
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generics_with_generics_fn_return_type_v2() {
|
||||||
|
mut f := neg_a
|
||||||
|
assert f(1) == -1
|
||||||
|
|
||||||
|
f = generic(neg_a)
|
||||||
|
assert f(2) == -2
|
||||||
|
f = generic(neg_b)
|
||||||
|
assert f(3) == -3
|
||||||
|
|
||||||
|
f = generic(fn (a int) int {
|
||||||
|
return -a
|
||||||
|
})
|
||||||
|
assert f(4) == -4
|
||||||
|
f = generic(fn (b int) int {
|
||||||
|
return -b
|
||||||
|
})
|
||||||
|
assert f(5) == -5
|
||||||
|
|
||||||
|
f = fn (a int) int {
|
||||||
|
return -a
|
||||||
|
}
|
||||||
|
f = generic(f)
|
||||||
|
assert f(6) == -6
|
||||||
|
f = fn (b int) int {
|
||||||
|
return -b
|
||||||
|
}
|
||||||
|
f = generic(f)
|
||||||
|
assert f(7) == -7
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue