From 5c67e5466e60b7fc8233c1e81a82083695aee91a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 15 Aug 2025 08:43:43 -0300 Subject: [PATCH] fix --- .../generics/generic_selector_field_test.v | 29 +++++++++++++++++++ vlib/v/type_resolver/generic_resolver.v | 3 ++ 2 files changed, 32 insertions(+) create mode 100644 vlib/v/tests/generics/generic_selector_field_test.v diff --git a/vlib/v/tests/generics/generic_selector_field_test.v b/vlib/v/tests/generics/generic_selector_field_test.v new file mode 100644 index 0000000000..21526dc393 --- /dev/null +++ b/vlib/v/tests/generics/generic_selector_field_test.v @@ -0,0 +1,29 @@ +module main + +struct Demo[T] { +mut: + val T +} + +type DemoType = int | []DemoType + +fn test_main() { + assert decode[Demo[[]DemoType]]() == Demo[[]DemoType]{} + assert decode[Demo[DemoType]]() == Demo[DemoType]{} +} + +fn decode[T]() T { + mut typ := T{} + typ.val = decode_x(typ.val) + return typ +} + +fn decode_x[T](_ T) T { + mut field := T{} + $if T is int { + field = 0 + } $else $if T is $array { + field = []DemoType{} + } + return field +} diff --git a/vlib/v/type_resolver/generic_resolver.v b/vlib/v/type_resolver/generic_resolver.v index 212c0979c6..79d5219647 100644 --- a/vlib/v/type_resolver/generic_resolver.v +++ b/vlib/v/type_resolver/generic_resolver.v @@ -342,6 +342,9 @@ pub fn (mut t TypeResolver) resolve_args(cur_fn &ast.FnDecl, func &ast.Fn, mut n } else { comptime_args[k] = ctyp } + } else if mut call_arg.expr is ast.SelectorExpr + && call_arg.expr.expr_type.has_flag(.generic) { + comptime_args[k] = t.typeof_type(call_arg.expr, call_arg.expr.typ) } } return comptime_args