From f27181e81b464fcd58dd543c0c1f809be364286d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 25 Dec 2024 07:05:53 -0300 Subject: [PATCH] cgen: fix thread struct name for same fn var name on different scope (fix #21746) (#23261) --- vlib/v/gen/c/spawn_and_go.v | 5 +++++ vlib/v/tests/chan_same_fn_name_test.v | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 vlib/v/tests/chan_same_fn_name_test.v diff --git a/vlib/v/gen/c/spawn_and_go.v b/vlib/v/gen/c/spawn_and_go.v index 833b7891b..f16285eab 100644 --- a/vlib/v/gen/c/spawn_and_go.v +++ b/vlib/v/gen/c/spawn_and_go.v @@ -30,6 +30,11 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) { mut use_tmp_fn_var := false tmp_fn := g.new_tmp_var() + if expr.is_fn_var { + // generate a name different for same var fn name declared in another scope + name = '${name}_${node.pos.pos}' + } + if expr.concrete_types.len > 0 { name = g.generic_fn_name(expr.concrete_types, name) } else if expr.is_fn_var && expr.fn_var_type.has_flag(.generic) { diff --git a/vlib/v/tests/chan_same_fn_name_test.v b/vlib/v/tests/chan_same_fn_name_test.v new file mode 100644 index 000000000..fee61dd91 --- /dev/null +++ b/vlib/v/tests/chan_same_fn_name_test.v @@ -0,0 +1,24 @@ +fn a() chan string { + ch_out := chan string{} + f := fn (a chan string) { + a <- 'foo' + } + spawn f(ch_out) + return ch_out +} + +fn b(ch_in chan string) string { + f := fn (a chan string, b chan string) { + val := <-a + {} + b <- val + } + ch_out := chan string{} + spawn f(ch_in, ch_out) + return <-ch_out +} + +fn test_main() { + ch0 := a() + assert b(ch0) == 'foo' +} -- 2.39.5