gen: fix go call with generic function (#8093)
parent
a1245de25b
commit
2030875c0a
|
@ -5386,6 +5386,12 @@ fn (mut g Gen) go_stmt(node ast.GoStmt) {
|
||||||
tmp := g.new_tmp_var()
|
tmp := g.new_tmp_var()
|
||||||
expr := node.call_expr as ast.CallExpr
|
expr := node.call_expr as ast.CallExpr
|
||||||
mut name := expr.name // util.no_dots(expr.name)
|
mut name := expr.name // util.no_dots(expr.name)
|
||||||
|
// TODO: fn call is duplicated. merge with fn_call().
|
||||||
|
if expr.generic_type != table.void_type && expr.generic_type != 0 {
|
||||||
|
// Using _T_ to differentiate between get<string> and get_string
|
||||||
|
// `foo<int>()` => `foo_T_int()`
|
||||||
|
name += '_T_' + g.typ(expr.generic_type)
|
||||||
|
}
|
||||||
if expr.is_method {
|
if expr.is_method {
|
||||||
receiver_sym := g.table.get_type_symbol(expr.receiver_type)
|
receiver_sym := g.table.get_type_symbol(expr.receiver_type)
|
||||||
name = receiver_sym.name + '_' + name
|
name = receiver_sym.name + '_' + name
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
fn test<T>(c chan int, s T) {
|
||||||
|
println('hi from generic fn test, T: ' + typeof(s).name)
|
||||||
|
println('s: $s')
|
||||||
|
assert true
|
||||||
|
c <- 123
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_go_generic_fn() {
|
||||||
|
mut c := chan int{}
|
||||||
|
go test<string>(c, 'abcd')
|
||||||
|
x := <-c
|
||||||
|
assert x == 123
|
||||||
|
println('bye')
|
||||||
|
}
|
Loading…
Reference in New Issue