Skip to content

Commit f27181e

Browse files
authored
cgen: fix thread struct name for same fn var name on different scope (fix #21746) (#23261)
1 parent 4cd3009 commit f27181e

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

vlib/v/gen/c/spawn_and_go.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
3030
mut use_tmp_fn_var := false
3131
tmp_fn := g.new_tmp_var()
3232

33+
if expr.is_fn_var {
34+
// generate a name different for same var fn name declared in another scope
35+
name = '${name}_${node.pos.pos}'
36+
}
37+
3338
if expr.concrete_types.len > 0 {
3439
name = g.generic_fn_name(expr.concrete_types, name)
3540
} else if expr.is_fn_var && expr.fn_var_type.has_flag(.generic) {

vlib/v/tests/chan_same_fn_name_test.v

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
fn a() chan string {
2+
ch_out := chan string{}
3+
f := fn (a chan string) {
4+
a <- 'foo'
5+
}
6+
spawn f(ch_out)
7+
return ch_out
8+
}
9+
10+
fn b(ch_in chan string) string {
11+
f := fn (a chan string, b chan string) {
12+
val := <-a
13+
{}
14+
b <- val
15+
}
16+
ch_out := chan string{}
17+
spawn f(ch_in, ch_out)
18+
return <-ch_out
19+
}
20+
21+
fn test_main() {
22+
ch0 := a()
23+
assert b(ch0) == 'foo'
24+
}

0 commit comments

Comments
 (0)