From 0cf3a445b73e558b1eb97b8875d7ab483073d862 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 11 Oct 2024 13:31:18 -0300 Subject: [PATCH] cgen: fix spawn generic codegen (fix #22484) (#22491) --- vlib/v/gen/c/spawn_and_go.v | 10 ++++---- vlib/v/tests/generics/generic_spawn_test.v | 29 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 vlib/v/tests/generics/generic_spawn_test.v 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 +}