Skip to content

Lint #[deprecated] on use items, where it has no effect - #165842

Open
johncarmack1984 wants to merge 1 commit into
rust-lang:mainfrom
johncarmack1984:deprecated-reexport-lint
Open

johncarmack1984 wants to merge 1 commit into
rust-lang:mainfrom
johncarmack1984:deprecated-reexport-lint

Conversation

@johncarmack1984

@johncarmack1984 johncarmack1984 commented Nov 12, 2026 •

Copy link
Copy Markdown

#[deprecated] on a use item is accepted and then ignored: deprecation is checked on the resolved item, not on the imports a path went through, so deprecating a re-export that way warns nobody (#30827). This adds ineffective_deprecated_reexports, a warn-by-default lint that says so at the attribute, notes that it's a long-standing bug, and suggests what does work: deprecating the item itself, or a #[deprecated] type alias or wrapper function where one applies.

Choices:

  • A new warn-by-default lint rather than useless_deprecated, which is deny-by-default. The review on Add lint rule for #[deprecated] on re-exports (rebase) #142731 asked for a lint instead of an error.
  • Emitted from the stability checker in rustc_passes, next to ineffective_unstable_reexports (lint ineffective #[unstable] annotations on re-exports #161178).
  • The help is prose, not a structured suggestion, because no single rewrite fits: a type alias doesn't carry tuple or unit struct constructors or use Alias::Variant, a function needs a wrapper, and a module or macro re-export has no equivalent.
  • core (alloc::LayoutErr) and std (collections::Bound) each carry one of these attributes. Both get an item-level #[expect], which std's deny-warnings build turns into an error once the lint stops firing there; core gets a FIXME, std already had one. The run-rustfix test in tests/ui/imports carries its expectation on the item: a crate-level one is unfulfilled in the fixed output, which deletes the annotated use.

The fix for #30827 should delete this lint.

Supersedes #142731 (I asked GrigorenkoPV there on Oct 22 whether they planned to return to it and haven't heard back). Closes #142436.

r? @WaffleLapkin

LLM disclosure: I wrote this lint. Claude Code (Fable 5.1, then Opus 5.5, both max effort) evaluated the design options in the issue's history, drafted the implementation, docs and tests, and ran the test suites. Codex reviewed. I pared and reviewed every line.

@rustbot rustbot added A-allocators Area: Custom and system allocators A-collections Area: `std::collections` (prefer A-binaryheap, A-btree, A-hashtable, A-linkedlist, A-vecdeque) labels Nov 12, 2026
@rustbot

rustbot commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator

WaffleLapkin is currently at their maximum review capacity.
They may take a while to respond.

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Nov 12, 2026
@rustbot

rustbot commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the pull request, and welcome! The Rust Project has assigned @WaffleLapkin (or someone else) to review your changes, you should hear from them (or someone else) within the next two weeks.

Please see the contribution instructions and our LLM policy for more information.

@rustbot

This comment has been minimized.

Deprecation is checked on the item a path resolves to, so a
`#[deprecated]` attribute on a `use` item is accepted and never consulted
at use sites. Deprecating a re-export that way warns nobody.

Add `ineffective_deprecated_reexports`, a warn-by-default lint emitted
from the stability checker for every `use` item carrying `#[deprecated]`.
Its note says this is a long-standing bug and links the tracking issue;
its help suggests deprecating the item itself, or a `#[deprecated]` type
alias or wrapper function where one applies.

core (`alloc::LayoutErr`) and std (`collections::Bound`) each carry one
of these attributes. Both get an item-level `#[expect]`, which std's
deny-warnings build turns into an error once the lint stops firing there,
so the annotations go away with the fix for deprecating re-exports. The
run-rustfix import test carries its expectation on the item too: a
crate-level one is unfulfilled in the fixed output, which removes the
annotated `use`.
@johncarmack1984
johncarmack1984 force-pushed the deprecated-reexport-lint branch from ee5fc9e to 0c50040 Compare November 12, 2026 04:07
@theemathas

Copy link
Copy Markdown
Contributor

What exactly is the LLM involvement here? What does "I wrote this lint" entail?

@Kivooeo

Kivooeo commented Nov 12, 2026 •

Copy link
Copy Markdown
Member

docs

Hi, first of all, all user-facing components including PR description should be written manually from start to finish; otherwise, this violates our policy. Second, you should have found a pre-arranged LLM reviewer in #llm-reviews before opening a PR.

More you can read in our LLM policy.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-allocators Area: Custom and system allocators A-collections Area: `std::collections` (prefer A-binaryheap, A-btree, A-hashtable, A-linkedlist, A-vecdeque) S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warn that #[deprecated] does not work on re-exports

5 participants