parent
1305ca662f
commit
170282b2af
|
@ -557,6 +557,13 @@ pub fn (mut c Checker) infer_fn_generic_types(f ast.Fn, mut call_expr ast.CallEx
|
||||||
}
|
}
|
||||||
} else if param.typ.has_flag(.variadic) {
|
} else if param.typ.has_flag(.variadic) {
|
||||||
to_set = c.table.mktyp(arg.typ)
|
to_set = c.table.mktyp(arg.typ)
|
||||||
|
} else if arg_sym.kind == .struct_ && param.typ.has_flag(.generic) {
|
||||||
|
info := arg_sym.info as ast.Struct
|
||||||
|
generic_names := info.generic_types.map(c.table.get_type_symbol(it).name)
|
||||||
|
if gt_name in generic_names {
|
||||||
|
idx := generic_names.index(gt_name)
|
||||||
|
typ = info.concrete_types[idx]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
struct Node<T> {
|
||||||
|
data T
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo<T>(n Node<T>) string {
|
||||||
|
return '$n'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generics_fn_infer_struct() {
|
||||||
|
ret1 := foo(Node<int>{})
|
||||||
|
println(ret1)
|
||||||
|
assert ret1.contains('Node<int>{')
|
||||||
|
assert ret1.contains('data: 0')
|
||||||
|
|
||||||
|
ret2 := foo(Node<byte>{})
|
||||||
|
println(ret2)
|
||||||
|
assert ret2.contains('Node<byte>{')
|
||||||
|
assert ret2.contains('data: 0')
|
||||||
|
}
|
Loading…
Reference in New Issue