diff --git a/vlib/v/gen/c/spawn_and_go.v b/vlib/v/gen/c/spawn_and_go.v index 32117885aa0c59..ad29c5bbc79b28 100644 --- a/vlib/v/gen/c/spawn_and_go.v +++ b/vlib/v/gen/c/spawn_and_go.v @@ -248,12 +248,12 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) { } } else { if f := g.table.find_fn(node.call_expr.name) { - mut muttable := unsafe { &ast.Table(g.table) } - return_type := muttable.convert_generic_type(f.return_type, f.generic_names, - node.call_expr.concrete_types) or { f.return_type } + concrete_types := node.call_expr.concrete_types.map(g.unwrap_generic(it)) + return_type := g.table.convert_generic_type(f.return_type, f.generic_names, + concrete_types) or { f.return_type } mut arg_types := f.params.map(it.typ) - arg_types = arg_types.map(muttable.convert_generic_type(it, f.generic_names, - node.call_expr.concrete_types) or { it }) + arg_types = arg_types.map(g.table.convert_generic_type(it, f.generic_names, + concrete_types) or { it }) for i, typ in arg_types { mut typ_sym := g.table.sym(typ) for { diff --git a/vlib/v/tests/generics/generic_spawn_test.v b/vlib/v/tests/generics/generic_spawn_test.v new file mode 100644 index 00000000000000..b746b92829c3de --- /dev/null +++ b/vlib/v/tests/generics/generic_spawn_test.v @@ -0,0 +1,29 @@ +module main + +struct In[T] { + source chan T +} + +fn emit[T](s In[T], ar []T) { + for _, i in ar { + s.source <- i + } +} + +fn from[T](ar []T) In[T] { + s := In[T]{} + + spawn emit(s, ar) + + return s +} + +fn (i In[T]) get() T { + return <-i.source +} + +fn test_main() { + v := from[int]([1]).get() + + assert v == 1 +}