Skip to content

Iterate over maybe_unused_trait_imports when checking dead trait imports #96873

Closed
@cjgillot

Description

@cjgillot

The resolver gathers a list of possibly unused trait imports in maybe_unused_trait_imports. This list is passed to resolver outputs, into the maybe_unused_trait_import query. This query takes a LocalDefId and returns whether the import is possibly unused.

This is used by the post-typeck unused import check in rustc_typeck::check_unused. This query iterates over all the use statements in the crate, checks whether they may be unused trait imports, and warns if they are indeed unused.

As there are typically very few unused trait imports compared to the number of items in a crate, it would make sense to directly iterate on maybe_unused_trait_imports.

Steps:

  • make maybe_unused_trait_imports an FxIndexSet both in Resolver and ResolverOutputs, this will ensure a deterministic iteration order;
  • rename maybe_unused_trait_import query and give it the signature maybe_unused_trait_imports: () -> FxIndexSet<LocalDefId>, and adapt the call site; we do not want to access tcx.resolutions(()) directly, as this would prevent the query system from detecting that the set has not changed;
  • in rustc_typeck::check_unused::check_crate, inline check_import and replace the loop over tcx.hir().items by a loop over tcx.maybe_unused_trait_imports(());
  • the filter over tcx.def_kind there can be removed too (or replaced by a debug-assertion): the set may only point to use statements.

Extra:

  • investigate why we check for item.span.is_empty(), and the consequences of removing that check;
  • investigate the impact on perf of converting the FxIndexSet to a simple Vec when producing ResolverOutputs from Resolver.

I am available on Zulip for any question.

Metadata

Metadata

Labels

E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.E-help-wantedCall for participation: Help is requested to fix this issue.E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions