From db2eb26e8eaa1e7dd779498357520ba7a09ea461 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 20:05:23 +0300 Subject: [PATCH] checker: fix compiler omits to define struct method used in generic function (fixes #26419) --- vlib/v/checker/used_features.v | 4 ++- ...ric_fn_method_call_on_generic_param_test.v | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics/generic_fn_method_call_on_generic_param_test.v diff --git a/vlib/v/checker/used_features.v b/vlib/v/checker/used_features.v index 615b7ee5d..b6b7c8c9e 100644 --- a/vlib/v/checker/used_features.v +++ b/vlib/v/checker/used_features.v @@ -166,7 +166,9 @@ fn (mut c Checker) markused_method_call(mut node ast.CallExpr, mut left_expr ast } else if left_type.has_flag(.generic) { unwrapped_left := c.unwrap_generic(left_type) c.table.used_features.comptime_calls['${int(unwrapped_left)}.${node.name}'] = true - if !unwrapped_left.is_ptr() && left_expr is ast.Ident && left_expr.is_mut() { + // Generic method calls can resolve to pointer receivers during cgen (`x.name()` -> `(&x).name()`). + // Mark both forms so skip-unused does not drop pointer receiver methods. + if !unwrapped_left.is_ptr() { c.table.used_features.comptime_calls['${int(unwrapped_left.ref())}.${node.name}'] = true } } diff --git a/vlib/v/tests/generics/generic_fn_method_call_on_generic_param_test.v b/vlib/v/tests/generics/generic_fn_method_call_on_generic_param_test.v new file mode 100644 index 000000000..f2805062b --- /dev/null +++ b/vlib/v/tests/generics/generic_fn_method_call_on_generic_param_test.v @@ -0,0 +1,30 @@ +struct MyA { + name string +} + +fn (a &MyA) name() string { + return a.name +} + +struct MyB { + name string +} + +fn (b &MyB) name() string { + return b.name +} + +fn display[T](o T) string { + return 'T is called ${o.name()}' +} + +fn test_generic_fn_method_call_on_generic_param() { + a := MyA{ + name: 'Ah' + } + b := MyB{ + name: 'Beh' + } + assert display[MyA](a) == 'T is called Ah' + assert display[MyB](b) == 'T is called Beh' +} -- 2.39.5