From ca1c7a306e29001714f697ed720589634affd32b Mon Sep 17 00:00:00 2001 From: Enrico Schaaf <54645197+enricoschaaf@users.noreply.github.com> Date: Wed, 1 Jul 2026 19:40:55 +0000 Subject: [PATCH] fix(diag): bound transitive unused dependency traversal --- src/diagnostics/rules/unused_dependencies.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/diagnostics/rules/unused_dependencies.rs b/src/diagnostics/rules/unused_dependencies.rs index 312d8d09939..1016fce3c8b 100644 --- a/src/diagnostics/rules/unused_dependencies.rs +++ b/src/diagnostics/rules/unused_dependencies.rs @@ -1,6 +1,7 @@ +use std::collections::VecDeque; use std::path::Path; -use crate::util::data_structures::IndexMap; +use crate::util::data_structures::{HashSet, IndexMap}; use cargo_util_schemas::manifest; use cargo_util_schemas::manifest::TomlPackageBuild; use cargo_util_terminal::report::AnnotationKind; @@ -366,7 +367,8 @@ fn is_transitive_dep( seen_units: &Vec, bcx: &BuildContext<'_, '_>, ) -> bool { - let mut queue = std::collections::VecDeque::new(); + let mut queue = VecDeque::new(); + let mut visited: HashSet<&Unit> = HashSet::default(); for root_unit in seen_units { for unit_dep in &bcx.unit_graph[root_unit] { if root_unit.pkg.package_id() == unit_dep.unit.pkg.package_id() { @@ -375,7 +377,9 @@ fn is_transitive_dep( if unit_dep.unit == *direct_dep_unit { continue; } - queue.push_back(&unit_dep.unit); + if visited.insert(&unit_dep.unit) { + queue.push_back(&unit_dep.unit); + } } } @@ -384,7 +388,9 @@ fn is_transitive_dep( if unit_dep.unit == *direct_dep_unit { return true; } - queue.push_back(&unit_dep.unit); + if visited.insert(&unit_dep.unit) { + queue.push_back(&unit_dep.unit); + } } }