From 70f694f72e9d0e12f1c0effbbff927806f22cb43 Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:39:42 +0100 Subject: [PATCH] cgen: fix generic_fn_name generating incorrect names for C structs (#25164) --- vlib/v/gen/c/cgen.v | 3 ++- vlib/v/tests/generics/foo.h | 9 +++++++++ .../v/tests/generics/generic_struct_cstruct_test.v | 14 ++++++++++++++ vlib/v/tests/generics/v.mod | 0 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics/foo.h create mode 100644 vlib/v/tests/generics/generic_struct_cstruct_test.v create mode 100644 vlib/v/tests/generics/v.mod diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 5fa5de541..9868fac16 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -1271,7 +1271,8 @@ fn (mut g Gen) generic_fn_name(types []ast.Type, before string) string { // `foo[int]()` => `foo_T_int()` mut name := before + '_T' for typ in types { - name += '_' + strings.repeat_string('__ptr__', typ.nr_muls()) + g.styp(typ.set_nr_muls(0)) + name += '_' + strings.repeat_string('__ptr__', typ.nr_muls()) + + g.styp(typ.set_nr_muls(0)).replace(' ', '_') } return name } diff --git a/vlib/v/tests/generics/foo.h b/vlib/v/tests/generics/foo.h new file mode 100644 index 000000000..9db679bfc --- /dev/null +++ b/vlib/v/tests/generics/foo.h @@ -0,0 +1,9 @@ +// foo.h +#ifndef TEST_H +#define TEST_H + +struct foo { + int a; +}; + +#endif diff --git a/vlib/v/tests/generics/generic_struct_cstruct_test.v b/vlib/v/tests/generics/generic_struct_cstruct_test.v new file mode 100644 index 000000000..a4d606767 --- /dev/null +++ b/vlib/v/tests/generics/generic_struct_cstruct_test.v @@ -0,0 +1,14 @@ +#insert "@VMODROOT/foo.h" + +struct C.foo { + a int +} + +fn ref[T](x T) &T { + return &x +} + +fn test_main() { + a := C.foo{} + b := ref(a) +} diff --git a/vlib/v/tests/generics/v.mod b/vlib/v/tests/generics/v.mod new file mode 100644 index 000000000..e69de29bb -- 2.39.5