From 0b12d647b618d76e1e09e198dc22fe3a521a2dc9 Mon Sep 17 00:00:00 2001 From: shove Date: Thu, 14 Dec 2023 04:32:52 +0800 Subject: [PATCH] cgen: fix wrong cname of anon fn(fix #20163) (#20164) --- vlib/v/gen/c/utils.v | 6 +++--- vlib/v/tests/anon_fn_test.v | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/vlib/v/gen/c/utils.v b/vlib/v/gen/c/utils.v index 8a449610c3..109d04cff5 100644 --- a/vlib/v/gen/c/utils.v +++ b/vlib/v/gen/c/utils.v @@ -113,9 +113,9 @@ fn (mut g Gen) fn_var_signature(return_type ast.Type, arg_types []ast.Type, var_ return sig } -// generate anon fn cname, e.g. `anon_fn_void_int_string` +// generate anon fn cname, e.g. `anon_fn_void_int_string`, `anon_fn_void_int_ptr_string` fn (mut g Gen) anon_fn_cname(return_type ast.Type, arg_types []ast.Type) string { - ret_styp := c_name(g.typ(return_type)) + ret_styp := c_name(g.typ(return_type).replace('*', '_ptr')) mut sig := '${ret_styp}_' for j, arg_typ in arg_types { arg_sym := g.table.sym(arg_typ) @@ -124,7 +124,7 @@ fn (mut g Gen) anon_fn_cname(return_type ast.Type, arg_types []ast.Type) string arg_sig := g.anon_fn_cname(func.return_type, func.params.map(it.typ)) sig += 'fnon_fn_' + arg_sig } else { - arg_styp := c_name(g.typ(arg_typ)) + arg_styp := c_name(g.typ(arg_typ).replace('*', '_ptr')) sig += arg_styp } if j < arg_types.len - 1 { diff --git a/vlib/v/tests/anon_fn_test.v b/vlib/v/tests/anon_fn_test.v index ba5b4790c6..b3637af4c2 100644 --- a/vlib/v/tests/anon_fn_test.v +++ b/vlib/v/tests/anon_fn_test.v @@ -41,3 +41,16 @@ fn test_anon_fn_returning_a_mut_parameter_should_act_the_same_as_normal_fn_retur y := fnormal(mut b, 123) assert a == b } + +// for issue 20163 +struct Struct {} + +fn test_spawn_anon_fn_with_closure_parameters_and_mut_ref_parameters() { + mut s := &Struct{} + a := 1 + + t := spawn fn [a] (mut s Struct) int { + return a + }(mut s) + assert t.wait() == 1 +}