checker,cgen: fix generics with generic_fn type parameter (#10022)
parent
82a9add25b
commit
3dfbd2351b
|
@ -2276,7 +2276,7 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type {
|
|||
if !found {
|
||||
if v := call_expr.scope.find_var(fn_name) {
|
||||
if v.typ != 0 {
|
||||
vts := c.table.get_type_symbol(v.typ)
|
||||
vts := c.table.get_type_symbol(c.unwrap_generic(v.typ))
|
||||
if vts.kind == .function {
|
||||
info := vts.info as ast.FnType
|
||||
func = info.func
|
||||
|
|
|
@ -371,18 +371,11 @@ fn (mut g Gen) fn_args(args []ast.Param, is_variadic bool) ([]string, []string)
|
|||
if arg_type_sym.kind == .function {
|
||||
info := arg_type_sym.info as ast.FnType
|
||||
func := info.func
|
||||
if !info.is_anon {
|
||||
g.write(arg_type_name + ' ' + caname)
|
||||
g.definitions.write_string(arg_type_name + ' ' + caname)
|
||||
fargs << caname
|
||||
fargtypes << arg_type_name
|
||||
} else {
|
||||
g.write('${g.typ(func.return_type)} (*$caname)(')
|
||||
g.definitions.write_string('${g.typ(func.return_type)} (*$caname)(')
|
||||
g.fn_args(func.params, func.is_variadic)
|
||||
g.write(')')
|
||||
g.definitions.write_string(')')
|
||||
}
|
||||
g.write('${g.typ(func.return_type)} (*$caname)(')
|
||||
g.definitions.write_string('${g.typ(func.return_type)} (*$caname)(')
|
||||
g.fn_args(func.params, func.is_variadic)
|
||||
g.write(')')
|
||||
g.definitions.write_string(')')
|
||||
} else {
|
||||
s := '$arg_type_name $caname'
|
||||
g.write(s)
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
fn neg(a int) int {
|
||||
return -a
|
||||
}
|
||||
|
||||
fn indirect_call(func fn (int) int, a int) int {
|
||||
println(typeof(func).name)
|
||||
return func(a)
|
||||
}
|
||||
|
||||
fn generic_call<T>(func T, a int) int {
|
||||
println(T.name)
|
||||
return func(a)
|
||||
}
|
||||
|
||||
fn generic_indirect_call<T>(func T, a int) int {
|
||||
println(T.name)
|
||||
return indirect_call(func, a)
|
||||
}
|
||||
|
||||
fn test_generics_with_generics_fn_type_parameter() {
|
||||
mut ret := 0
|
||||
|
||||
ret = indirect_call(neg, 2)
|
||||
println(ret)
|
||||
assert ret == -2
|
||||
|
||||
ret = generic_call(neg, 3)
|
||||
println(ret)
|
||||
assert ret == -3
|
||||
|
||||
ret = generic_indirect_call(neg, 4)
|
||||
println(ret)
|
||||
assert ret == -4
|
||||
}
|
Loading…
Reference in New Issue