From bc62c5cfd744841e8367b7ff2ff2d3dbd25d1cc4 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 26 Nov 2023 08:58:23 -0300 Subject: [PATCH] cgen: fix code generation for generic channels (#19993) --- vlib/v/ast/table.v | 7 ++++++- vlib/v/tests/chan_generic_test.v | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/chan_generic_test.v diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 6cff4978a20776..b1a06a8580151e 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -922,7 +922,12 @@ pub fn (t &Table) chan_cname(elem_type Type, is_mut bool) string { } else if elem_type.is_ptr() { suffix = '_ptr' } - return 'chan_${elem_type_sym.cname}' + suffix + type_name := if elem_type_sym.cname.contains('[') { + elem_type_sym.cname.replace_each(ast.map_cname_escape_seq) + } else { + elem_type_sym.cname + } + return 'chan_${type_name}' + suffix } @[inline] diff --git a/vlib/v/tests/chan_generic_test.v b/vlib/v/tests/chan_generic_test.v new file mode 100644 index 00000000000000..4b43d33c2347c3 --- /dev/null +++ b/vlib/v/tests/chan_generic_test.v @@ -0,0 +1,16 @@ +struct Task[T] { + idx int + task T +} + +fn check[T](input T) T { + ch := chan Task[T]{} + // do something with channel + ch.close() + return input +} + +fn test_main() { + out := check[int](5) + assert out == 5 +}