From c91cb876714ebf0d55fc11e486ff08b5d9e54bf2 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Thu, 29 May 2025 04:51:17 -0300 Subject: [PATCH] cgen: fix generic name handling for struct generic (fix #24530) (#24565) --- vlib/v/gen/c/fn.v | 7 +++++- .../v/tests/generics/generic_fn_struct_test.v | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics/generic_fn_struct_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index ed4987bd0..736f30cdf 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -561,6 +561,7 @@ fn (mut g Gen) c_fn_name(node &ast.FnDecl) string { if node.generic_names.len > 0 { name = g.generic_fn_name(g.cur_concrete_types, name) + name = name.replace_each(c_fn_name_escape_seq) } if g.pref.translated || g.file.is_translated || node.is_file_translated { @@ -753,7 +754,10 @@ fn (mut g Gen) fn_decl_params(params []ast.Param, scope &ast.Scope, is_variadic typ = g.table.sym(typ).array_info().elem_type.set_flag(.variadic) } param_type_sym := g.table.sym(typ) - mut param_type_name := g.styp(typ).replace_each(c_fn_name_escape_seq) + mut param_type_name := g.styp(typ) + if param.typ.has_flag(.generic) { + param_type_name = param_type_name.replace_each(c_fn_name_escape_seq) + } if param_type_sym.kind == .function && !typ.has_flag(.option) { info := param_type_sym.info as ast.FnType func := info.func @@ -2012,6 +2016,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { } } name = g.generic_fn_name(concrete_types, name) + name = name.replace_each(c_fn_name_escape_seq) } } } diff --git a/vlib/v/tests/generics/generic_fn_struct_test.v b/vlib/v/tests/generics/generic_fn_struct_test.v new file mode 100644 index 000000000..cc80c1e1b --- /dev/null +++ b/vlib/v/tests/generics/generic_fn_struct_test.v @@ -0,0 +1,23 @@ +module main + +struct People[T] { + raw T +} + +struct Man { + name string +} + +fn test_main() { + m1 := Man{ + name: 'Tom' + } + gen1(m1) +} + +fn gen1[T](m T) { + gen2[People[T]]() +} + +fn gen2[T]() { +} -- 2.39.5