From 2d314fc9b0a58bfc03e93464f033f641d2de2d52 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 11 Dec 2024 11:05:25 -0300 Subject: [PATCH] cgen: fix codegen for generic selector expr (fix #22974) (#23132) --- vlib/v/gen/c/cgen.v | 2 +- vlib/v/tests/generic_selector_ptr_test.v | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generic_selector_ptr_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 978ba1dab8..c2d07356da 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4278,7 +4278,7 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { } alias_to_ptr := sym.info is ast.Alias && sym.info.parent_type.is_ptr() if field_is_opt - || ((node.expr_type.is_ptr() || sym.kind == .chan || alias_to_ptr) + || ((g.unwrap_generic(node.expr_type).is_ptr() || sym.kind == .chan || alias_to_ptr) && node.from_embed_types.len == 0) || (node.expr.is_as_cast() && g.inside_smartcast) { g.write('->') diff --git a/vlib/v/tests/generic_selector_ptr_test.v b/vlib/v/tests/generic_selector_ptr_test.v new file mode 100644 index 0000000000..bcef5423f9 --- /dev/null +++ b/vlib/v/tests/generic_selector_ptr_test.v @@ -0,0 +1,19 @@ +module main + +struct Foo123 { + field string = 'foobar' +} + +fn gen_func[T](value T) string { + $if T is i32 { + return '123' + } $else $if T is &Foo123 { + return value.field + } $else { + return '123' + } +} + +fn test_main() { + assert gen_func[&Foo123](&Foo123{}) == 'foobar' +}