From 373e5abb4755c4cc7b4d342b0482853ef981dbcd Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Mon, 15 Sep 2025 17:08:53 +0100 Subject: [PATCH] markused: fix marking of mutable generic method calls (fix #25312) (#25314) --- vlib/v/markused/walker.v | 15 +++++++++++ .../generic_fn_multi_mutable_struct_test.v | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 vlib/v/tests/generics/generic_fn_multi_mutable_struct_test.v diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index e16a17eab..263d3e65e 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -35,6 +35,7 @@ mut: all_decltypes map[string]ast.TypeDecl all_structs map[string]ast.StructDecl + cur_fn string level int is_builtin_mod bool is_direct_array_access bool @@ -934,6 +935,7 @@ pub fn (mut w Walker) fn_decl(mut node ast.FnDecl) { } w.mark_fn_ret_and_params(node.return_type, node.params) w.mark_fn_as_used(fkey) + w.cur_fn = fkey w.stmts(node.stmts) w.defer_stmts(node.defer_stmts) } @@ -989,6 +991,19 @@ pub fn (mut w Walker) call_expr(mut node ast.CallExpr) { fn_embed := '${int(embed_types.last())}.${node.name}' w.fn_by_name(fn_embed) } + } else if node.left_type.has_flag(.generic) { + if w.cur_fn != '' { + if concrete_types_list := w.table.fn_generic_types[w.cur_fn] { + for concrete_types in concrete_types_list { + for concrete_type in concrete_types { + method_name := '${int(concrete_type)}.${node.name}' + if !w.used_fns[method_name] { + w.fn_by_name(method_name) + } + } + } + } + } } else { match left_sym.info { ast.Array, ast.ArrayFixed { diff --git a/vlib/v/tests/generics/generic_fn_multi_mutable_struct_test.v b/vlib/v/tests/generics/generic_fn_multi_mutable_struct_test.v new file mode 100644 index 000000000..63936f9a1 --- /dev/null +++ b/vlib/v/tests/generics/generic_fn_multi_mutable_struct_test.v @@ -0,0 +1,26 @@ +struct Aa { +} + +fn (aa Aa) dump() { + println(aa) +} + +struct Bb { +} + +fn (bb Bb) dump() { + println(bb) +} + +struct Foo { +} + +fn (foo Foo) set[T](mut obj T) { + obj.dump() +} + +fn test_main() { + f := Foo{} + f.set(mut Aa{}) + f.set(mut Bb{}) +} -- 2.39.5