From 565e6efb3f8eec06115e08296a0ea7ee4851687c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 3 Nov 2025 04:55:46 -0300 Subject: [PATCH] markused: fix fn marked as used when variable and fn uses same name (fix #25649) (#25650) --- vlib/v/markused/walker.v | 6 ++- .../tests/skip_unused/for_linked_list.run.out | 0 .../for_linked_list.skip_unused.run.out | 0 vlib/v/tests/skip_unused/for_linked_list.vv | 40 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/skip_unused/for_linked_list.run.out create mode 100644 vlib/v/tests/skip_unused/for_linked_list.skip_unused.run.out create mode 100644 vlib/v/tests/skip_unused/for_linked_list.vv diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index 7fb4bc9de..1c1a374a5 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -728,7 +728,11 @@ fn (mut w Walker) expr(node_ ast.Expr) { } else if node.name in w.all_globals { w.mark_global_as_used(node.name) } else { - w.fn_by_name(node.name) + if (node.kind == .variable && node.obj is ast.Var && node.obj.is_used + && node.obj.typ != 0 && w.table.type_kind(node.obj.typ) == .function) + || (node.kind == .unresolved && node.name.contains('.')) { + w.fn_by_name(node.name) + } } if !w.uses_atomic && node.info is ast.IdentVar { w.uses_atomic = node.info.typ.has_flag(.atomic_f) diff --git a/vlib/v/tests/skip_unused/for_linked_list.run.out b/vlib/v/tests/skip_unused/for_linked_list.run.out new file mode 100644 index 000000000..e69de29bb diff --git a/vlib/v/tests/skip_unused/for_linked_list.skip_unused.run.out b/vlib/v/tests/skip_unused/for_linked_list.skip_unused.run.out new file mode 100644 index 000000000..e69de29bb diff --git a/vlib/v/tests/skip_unused/for_linked_list.vv b/vlib/v/tests/skip_unused/for_linked_list.vv new file mode 100644 index 000000000..fd03be26e --- /dev/null +++ b/vlib/v/tests/skip_unused/for_linked_list.vv @@ -0,0 +1,40 @@ +struct Node { +mut: + value int + prev ?&Node + next ?&Node +} + +struct LinkedList { +mut: + length int + head ?&Node +} + +pub fn (mut l LinkedList) push(value int) { + mut new_node := &Node{ + value: value + } + + if mut head := l.head { + for head.next != none { + if mut head_next := head.next { + head = head_next + } + } + head.next = new_node + new_node.prev = head + } else { + l.head = new_node + } +} + +fn main() { + mut list := LinkedList{ + length: 0 + head: none + } + list.push(1) + list.push(2) + list.push(3) +} -- 2.39.5