From 804c4362c1048e7ab49c26b2fbfa1a214d2e1a84 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 16 Aug 2025 05:40:34 -0300 Subject: [PATCH] resolver: fix generic selector field type resolver (fix #24570) (#25112) --- .../generics/generic_selector_field_test.v | 29 +++++++++++++++++++ vlib/v/type_resolver/generic_resolver.v | 13 +++++++++ 2 files changed, 42 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 000000000..21526dc39 --- /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 212c0979c..b7b1c657d 100644 --- a/vlib/v/type_resolver/generic_resolver.v +++ b/vlib/v/type_resolver/generic_resolver.v @@ -342,6 +342,19 @@ 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) && call_arg.expr.expr is ast.Ident { + mut ctyp := t.typeof_type(call_arg.expr, call_arg.expr.typ) + param_typ_sym := t.table.sym(param_typ) + cparam_type_sym := t.table.sym(ctyp) + if param_typ_sym.kind == .array && cparam_type_sym.info is ast.Array { + comptime_args[k] = cparam_type_sym.info.elem_type + } else if param_typ_sym.kind == .map && cparam_type_sym.info is ast.Map { + comptime_args[k] = cparam_type_sym.info.key_type + comptime_args[k + 1] = cparam_type_sym.info.value_type + } else { + comptime_args[k] = ctyp + } } } return comptime_args -- 2.39.5