From 2ccad45f29b8ecff58d28f77da14c232b23a0d74 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:32:23 +0200 Subject: [PATCH 1/7] Remove `AttributeLintKind::DocTestTakesList` variant --- compiler/rustc_attr_parsing/src/attributes/doc.rs | 9 +++++---- compiler/rustc_attr_parsing/src/errors.rs | 4 ++++ compiler/rustc_lint/src/early/diagnostics.rs | 2 -- compiler/rustc_lint/src/lints.rs | 4 ---- compiler/rustc_lint_defs/src/lib.rs | 1 - 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/doc.rs b/compiler/rustc_attr_parsing/src/attributes/doc.rs index 09d474a227fb..8edbcfc6898c 100644 --- a/compiler/rustc_attr_parsing/src/attributes/doc.rs +++ b/compiler/rustc_attr_parsing/src/attributes/doc.rs @@ -15,8 +15,9 @@ use crate::context::{AcceptContext, FinalizeContext, Stage}; use crate::errors::{ DocAliasDuplicated, DocAutoCfgExpectsHideOrShow, DocAutoCfgHideShowExpectsList, - DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocUnknownAny, DocUnknownInclude, - DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, IllFormedAttributeInput, + DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocTestTakesList, DocUnknownAny, + DocUnknownInclude, DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, + IllFormedAttributeInput, }; use crate::parser::{ArgParser, MetaItemOrLitParser, MetaItemParser, OwnedPathParser}; use crate::session_diagnostics::{ @@ -587,9 +588,9 @@ macro_rules! string_arg_and_crate_level { Some(sym::auto_cfg) => self.parse_auto_cfg(cx, path, args), Some(sym::test) => { let Some(list) = args.list() else { - cx.emit_lint( + cx.emit_dyn_lint( rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES, - AttributeLintKind::DocTestTakesList, + |dcx, level| DocTestTakesList.into_diag(dcx, level), args.span().unwrap_or(path.span()), ); return; diff --git a/compiler/rustc_attr_parsing/src/errors.rs b/compiler/rustc_attr_parsing/src/errors.rs index 8e4dfb40ad86..567d02f1640c 100644 --- a/compiler/rustc_attr_parsing/src/errors.rs +++ b/compiler/rustc_attr_parsing/src/errors.rs @@ -253,6 +253,10 @@ pub(crate) struct DocUnknownAny { #[diag("expected boolean for `#[doc(auto_cfg = ...)]`")] pub(crate) struct DocAutoCfgWrongLiteral; +#[derive(Diagnostic)] +#[diag("`#[doc(test(...)]` takes a list of attributes")] +pub(crate) struct DocTestTakesList; + #[derive(Diagnostic)] #[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")] pub(crate) struct DiagnosticOnConstOnlyForTraitImpls { diff --git a/compiler/rustc_lint/src/early/diagnostics.rs b/compiler/rustc_lint/src/early/diagnostics.rs index 4a0320cbaf80..a556f3448f76 100644 --- a/compiler/rustc_lint/src/early/diagnostics.rs +++ b/compiler/rustc_lint/src/early/diagnostics.rs @@ -43,8 +43,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> { .into_diag(dcx, level) } - &AttributeLintKind::DocTestTakesList => lints::DocTestTakesList.into_diag(dcx, level), - &AttributeLintKind::DocTestUnknown { name } => { lints::DocTestUnknown { name }.into_diag(dcx, level) } diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index 19fabc51ae53..2aab596d3250 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -3303,10 +3303,6 @@ fn add_to_diag(self, diag: &mut Diag<'_, G>) { )] pub(crate) struct ExpectedNameValue; -#[derive(Diagnostic)] -#[diag("`#[doc(test(...)]` takes a list of attributes")] -pub(crate) struct DocTestTakesList; - #[derive(Diagnostic)] #[diag("unknown `doc(test)` attribute `{$name}`")] pub(crate) struct DocTestUnknown { diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 96c7dec3d818..a257968694b1 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -656,7 +656,6 @@ pub enum DeprecatedSinceKind { pub enum AttributeLintKind { UnexpectedCfgName((Symbol, Span), Option<(Symbol, Span)>), UnexpectedCfgValue((Symbol, Span), Option<(Symbol, Span)>), - DocTestTakesList, DocTestUnknown { name: Symbol }, DocTestLiteral, AttrCrateLevelOnly, From b1cc9a60d83132e556a16800792cc84caf359489 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:32:23 +0200 Subject: [PATCH 2/7] Remove `AttributeLintKind::DocTestUnknown` variant --- compiler/rustc_attr_parsing/src/attributes/doc.rs | 8 ++++---- compiler/rustc_attr_parsing/src/errors.rs | 6 ++++++ compiler/rustc_lint/src/early/diagnostics.rs | 4 ---- compiler/rustc_lint/src/lints.rs | 6 ------ compiler/rustc_lint_defs/src/lib.rs | 1 - 5 files changed, 10 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/doc.rs b/compiler/rustc_attr_parsing/src/attributes/doc.rs index 8edbcfc6898c..1bdcdd1d4ba4 100644 --- a/compiler/rustc_attr_parsing/src/attributes/doc.rs +++ b/compiler/rustc_attr_parsing/src/attributes/doc.rs @@ -15,8 +15,8 @@ use crate::context::{AcceptContext, FinalizeContext, Stage}; use crate::errors::{ DocAliasDuplicated, DocAutoCfgExpectsHideOrShow, DocAutoCfgHideShowExpectsList, - DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocTestTakesList, DocUnknownAny, - DocUnknownInclude, DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, + DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocTestTakesList, DocTestUnknown, + DocUnknownAny, DocUnknownInclude, DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, IllFormedAttributeInput, }; use crate::parser::{ArgParser, MetaItemOrLitParser, MetaItemParser, OwnedPathParser}; @@ -217,9 +217,9 @@ fn parse_single_test_doc_attr_item( } } Some(name) => { - cx.emit_lint( + cx.emit_dyn_lint( rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES, - AttributeLintKind::DocTestUnknown { name }, + move |dcx, level| DocTestUnknown { name }.into_diag(dcx, level), path.span(), ); } diff --git a/compiler/rustc_attr_parsing/src/errors.rs b/compiler/rustc_attr_parsing/src/errors.rs index 567d02f1640c..8ebddd296ed6 100644 --- a/compiler/rustc_attr_parsing/src/errors.rs +++ b/compiler/rustc_attr_parsing/src/errors.rs @@ -257,6 +257,12 @@ pub(crate) struct DocUnknownAny { #[diag("`#[doc(test(...)]` takes a list of attributes")] pub(crate) struct DocTestTakesList; +#[derive(Diagnostic)] +#[diag("unknown `doc(test)` attribute `{$name}`")] +pub(crate) struct DocTestUnknown { + pub name: Symbol, +} + #[derive(Diagnostic)] #[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")] pub(crate) struct DiagnosticOnConstOnlyForTraitImpls { diff --git a/compiler/rustc_lint/src/early/diagnostics.rs b/compiler/rustc_lint/src/early/diagnostics.rs index a556f3448f76..489988053922 100644 --- a/compiler/rustc_lint/src/early/diagnostics.rs +++ b/compiler/rustc_lint/src/early/diagnostics.rs @@ -43,10 +43,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> { .into_diag(dcx, level) } - &AttributeLintKind::DocTestUnknown { name } => { - lints::DocTestUnknown { name }.into_diag(dcx, level) - } - &AttributeLintKind::DocTestLiteral => lints::DocTestLiteral.into_diag(dcx, level), &AttributeLintKind::AttrCrateLevelOnly => { diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index 2aab596d3250..9f7af4ffe7a1 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -3303,12 +3303,6 @@ fn add_to_diag(self, diag: &mut Diag<'_, G>) { )] pub(crate) struct ExpectedNameValue; -#[derive(Diagnostic)] -#[diag("unknown `doc(test)` attribute `{$name}`")] -pub(crate) struct DocTestUnknown { - pub name: Symbol, -} - #[derive(Diagnostic)] #[diag("`#![doc(test(...)]` does not take a literal")] pub(crate) struct DocTestLiteral; diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index a257968694b1..36a563241da4 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -656,7 +656,6 @@ pub enum DeprecatedSinceKind { pub enum AttributeLintKind { UnexpectedCfgName((Symbol, Span), Option<(Symbol, Span)>), UnexpectedCfgValue((Symbol, Span), Option<(Symbol, Span)>), - DocTestUnknown { name: Symbol }, DocTestLiteral, AttrCrateLevelOnly, DoNotRecommendDoesNotExpectArgs, From 33b896a06790d72ba36c96170f86e9338864ff44 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:32:23 +0200 Subject: [PATCH 3/7] Remove `AttributeLintKind::DocTestLiteral` variant --- compiler/rustc_attr_parsing/src/attributes/doc.rs | 10 +++++----- compiler/rustc_attr_parsing/src/errors.rs | 4 ++++ compiler/rustc_lint/src/early/diagnostics.rs | 2 -- compiler/rustc_lint/src/lints.rs | 4 ---- compiler/rustc_lint_defs/src/lib.rs | 1 - 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/doc.rs b/compiler/rustc_attr_parsing/src/attributes/doc.rs index 1bdcdd1d4ba4..48393938d1d7 100644 --- a/compiler/rustc_attr_parsing/src/attributes/doc.rs +++ b/compiler/rustc_attr_parsing/src/attributes/doc.rs @@ -15,9 +15,9 @@ use crate::context::{AcceptContext, FinalizeContext, Stage}; use crate::errors::{ DocAliasDuplicated, DocAutoCfgExpectsHideOrShow, DocAutoCfgHideShowExpectsList, - DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocTestTakesList, DocTestUnknown, - DocUnknownAny, DocUnknownInclude, DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, - IllFormedAttributeInput, + DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocTestLiteral, DocTestTakesList, + DocTestUnknown, DocUnknownAny, DocUnknownInclude, DocUnknownPasses, DocUnknownPlugins, + DocUnknownSpotlight, IllFormedAttributeInput, }; use crate::parser::{ArgParser, MetaItemOrLitParser, MetaItemParser, OwnedPathParser}; use crate::session_diagnostics::{ @@ -224,9 +224,9 @@ fn parse_single_test_doc_attr_item( ); } None => { - cx.emit_lint( + cx.emit_dyn_lint( rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES, - AttributeLintKind::DocTestLiteral, + |dcx, level| DocTestLiteral.into_diag(dcx, level), path.span(), ); } diff --git a/compiler/rustc_attr_parsing/src/errors.rs b/compiler/rustc_attr_parsing/src/errors.rs index 8ebddd296ed6..5929009c8faa 100644 --- a/compiler/rustc_attr_parsing/src/errors.rs +++ b/compiler/rustc_attr_parsing/src/errors.rs @@ -263,6 +263,10 @@ pub(crate) struct DocTestUnknown { pub name: Symbol, } +#[derive(Diagnostic)] +#[diag("`#![doc(test(...)]` does not take a literal")] +pub(crate) struct DocTestLiteral; + #[derive(Diagnostic)] #[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")] pub(crate) struct DiagnosticOnConstOnlyForTraitImpls { diff --git a/compiler/rustc_lint/src/early/diagnostics.rs b/compiler/rustc_lint/src/early/diagnostics.rs index 489988053922..a35427126929 100644 --- a/compiler/rustc_lint/src/early/diagnostics.rs +++ b/compiler/rustc_lint/src/early/diagnostics.rs @@ -43,8 +43,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> { .into_diag(dcx, level) } - &AttributeLintKind::DocTestLiteral => lints::DocTestLiteral.into_diag(dcx, level), - &AttributeLintKind::AttrCrateLevelOnly => { lints::AttrCrateLevelOnly.into_diag(dcx, level) } diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index 9f7af4ffe7a1..b1cc7194729e 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -3303,10 +3303,6 @@ fn add_to_diag(self, diag: &mut Diag<'_, G>) { )] pub(crate) struct ExpectedNameValue; -#[derive(Diagnostic)] -#[diag("`#![doc(test(...)]` does not take a literal")] -pub(crate) struct DocTestLiteral; - #[derive(Diagnostic)] #[diag("this attribute can only be applied at the crate level")] #[note( diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 36a563241da4..73990074cdef 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -656,7 +656,6 @@ pub enum DeprecatedSinceKind { pub enum AttributeLintKind { UnexpectedCfgName((Symbol, Span), Option<(Symbol, Span)>), UnexpectedCfgValue((Symbol, Span), Option<(Symbol, Span)>), - DocTestLiteral, AttrCrateLevelOnly, DoNotRecommendDoesNotExpectArgs, CrateTypeUnknown { span: Span, suggested: Option }, From a9f16fa6465d38f3e1015b407a50f7cb8e7e539f Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:32:24 +0200 Subject: [PATCH 4/7] Remove `AttributeLintKind::AttrCrateLevelOnly` variant --- compiler/rustc_attr_parsing/src/attributes/doc.rs | 12 ++++++------ compiler/rustc_attr_parsing/src/errors.rs | 7 +++++++ compiler/rustc_lint/src/early/diagnostics.rs | 4 ---- compiler/rustc_lint/src/lints.rs | 7 ------- compiler/rustc_lint_defs/src/lib.rs | 1 - 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/doc.rs b/compiler/rustc_attr_parsing/src/attributes/doc.rs index 48393938d1d7..2b6d56c41193 100644 --- a/compiler/rustc_attr_parsing/src/attributes/doc.rs +++ b/compiler/rustc_attr_parsing/src/attributes/doc.rs @@ -14,10 +14,10 @@ use super::{AcceptMapping, AttributeParser}; use crate::context::{AcceptContext, FinalizeContext, Stage}; use crate::errors::{ - DocAliasDuplicated, DocAutoCfgExpectsHideOrShow, DocAutoCfgHideShowExpectsList, - DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocTestLiteral, DocTestTakesList, - DocTestUnknown, DocUnknownAny, DocUnknownInclude, DocUnknownPasses, DocUnknownPlugins, - DocUnknownSpotlight, IllFormedAttributeInput, + AttrCrateLevelOnly, DocAliasDuplicated, DocAutoCfgExpectsHideOrShow, + DocAutoCfgHideShowExpectsList, DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, + DocTestLiteral, DocTestTakesList, DocTestUnknown, DocUnknownAny, DocUnknownInclude, + DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, IllFormedAttributeInput, }; use crate::parser::{ArgParser, MetaItemOrLitParser, MetaItemParser, OwnedPathParser}; use crate::session_diagnostics::{ @@ -68,9 +68,9 @@ fn check_attr_not_crate_level( /// Checks that an attribute is used at the crate level. Returns `true` if valid. fn check_attr_crate_level(cx: &mut AcceptContext<'_, '_, S>, span: Span) -> bool { if cx.shared.target != Target::Crate { - cx.emit_lint( + cx.emit_dyn_lint( rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES, - AttributeLintKind::AttrCrateLevelOnly, + |dcx, level| AttrCrateLevelOnly.into_diag(dcx, level), span, ); return false; diff --git a/compiler/rustc_attr_parsing/src/errors.rs b/compiler/rustc_attr_parsing/src/errors.rs index 5929009c8faa..daccaad02e9b 100644 --- a/compiler/rustc_attr_parsing/src/errors.rs +++ b/compiler/rustc_attr_parsing/src/errors.rs @@ -267,6 +267,13 @@ pub(crate) struct DocTestUnknown { #[diag("`#![doc(test(...)]` does not take a literal")] pub(crate) struct DocTestLiteral; +#[derive(Diagnostic)] +#[diag("this attribute can only be applied at the crate level")] +#[note( + "read for more information" +)] +pub(crate) struct AttrCrateLevelOnly; + #[derive(Diagnostic)] #[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")] pub(crate) struct DiagnosticOnConstOnlyForTraitImpls { diff --git a/compiler/rustc_lint/src/early/diagnostics.rs b/compiler/rustc_lint/src/early/diagnostics.rs index a35427126929..7ce3a4f6e462 100644 --- a/compiler/rustc_lint/src/early/diagnostics.rs +++ b/compiler/rustc_lint/src/early/diagnostics.rs @@ -43,10 +43,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> { .into_diag(dcx, level) } - &AttributeLintKind::AttrCrateLevelOnly => { - lints::AttrCrateLevelOnly.into_diag(dcx, level) - } - &AttributeLintKind::DoNotRecommendDoesNotExpectArgs => { lints::DoNotRecommendDoesNotExpectArgs.into_diag(dcx, level) } diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index b1cc7194729e..93d8cb1e24a8 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -3303,13 +3303,6 @@ fn add_to_diag(self, diag: &mut Diag<'_, G>) { )] pub(crate) struct ExpectedNameValue; -#[derive(Diagnostic)] -#[diag("this attribute can only be applied at the crate level")] -#[note( - "read for more information" -)] -pub(crate) struct AttrCrateLevelOnly; - #[derive(Diagnostic)] #[diag("`#[diagnostic::do_not_recommend]` does not expect any arguments")] pub(crate) struct DoNotRecommendDoesNotExpectArgs; diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 73990074cdef..a7b0c514c430 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -656,7 +656,6 @@ pub enum DeprecatedSinceKind { pub enum AttributeLintKind { UnexpectedCfgName((Symbol, Span), Option<(Symbol, Span)>), UnexpectedCfgValue((Symbol, Span), Option<(Symbol, Span)>), - AttrCrateLevelOnly, DoNotRecommendDoesNotExpectArgs, CrateTypeUnknown { span: Span, suggested: Option }, MalformedDoc, From 6b782884e7c5d663b74562d20c95fb341f7d1c14 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:32:24 +0200 Subject: [PATCH 5/7] Remove `AttributeLintKind::DoNotRecommendDoesNotExpectArgs` variant --- .../src/attributes/diagnostic/do_not_recommend.rs | 5 ++--- compiler/rustc_attr_parsing/src/errors.rs | 4 ++++ compiler/rustc_lint/src/early/diagnostics.rs | 4 ---- compiler/rustc_lint/src/lints.rs | 4 ---- compiler/rustc_lint_defs/src/lib.rs | 1 - 5 files changed, 6 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/diagnostic/do_not_recommend.rs b/compiler/rustc_attr_parsing/src/attributes/diagnostic/do_not_recommend.rs index 8cf6be088a7a..bf811438db93 100644 --- a/compiler/rustc_attr_parsing/src/attributes/diagnostic/do_not_recommend.rs +++ b/compiler/rustc_attr_parsing/src/attributes/diagnostic/do_not_recommend.rs @@ -2,7 +2,6 @@ use rustc_feature::{AttributeTemplate, template}; use rustc_hir::Target; use rustc_hir::attrs::AttributeKind; -use rustc_hir::lints::AttributeLintKind; use rustc_session::lint::builtin::{ MALFORMED_DIAGNOSTIC_ATTRIBUTES, MISPLACED_DIAGNOSTIC_ATTRIBUTES, }; @@ -25,9 +24,9 @@ impl SingleAttributeParser for DoNotRecommendParser { fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option { let attr_span = cx.attr_span; if !matches!(args, ArgParser::NoArgs) { - cx.emit_lint( + cx.emit_dyn_lint( MALFORMED_DIAGNOSTIC_ATTRIBUTES, - AttributeLintKind::DoNotRecommendDoesNotExpectArgs, + |dcx, level| crate::errors::DoNotRecommendDoesNotExpectArgs.into_diag(dcx, level), attr_span, ); } diff --git a/compiler/rustc_attr_parsing/src/errors.rs b/compiler/rustc_attr_parsing/src/errors.rs index daccaad02e9b..188f7d0578c5 100644 --- a/compiler/rustc_attr_parsing/src/errors.rs +++ b/compiler/rustc_attr_parsing/src/errors.rs @@ -274,6 +274,10 @@ pub(crate) struct DocTestUnknown { )] pub(crate) struct AttrCrateLevelOnly; +#[derive(Diagnostic)] +#[diag("`#[diagnostic::do_not_recommend]` does not expect any arguments")] +pub(crate) struct DoNotRecommendDoesNotExpectArgs; + #[derive(Diagnostic)] #[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")] pub(crate) struct DiagnosticOnConstOnlyForTraitImpls { diff --git a/compiler/rustc_lint/src/early/diagnostics.rs b/compiler/rustc_lint/src/early/diagnostics.rs index 7ce3a4f6e462..e204e9211e56 100644 --- a/compiler/rustc_lint/src/early/diagnostics.rs +++ b/compiler/rustc_lint/src/early/diagnostics.rs @@ -43,10 +43,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> { .into_diag(dcx, level) } - &AttributeLintKind::DoNotRecommendDoesNotExpectArgs => { - lints::DoNotRecommendDoesNotExpectArgs.into_diag(dcx, level) - } - &AttributeLintKind::CrateTypeUnknown { span, suggested } => lints::UnknownCrateTypes { sugg: suggested.map(|s| lints::UnknownCrateTypesSuggestion { span, snippet: s }), } diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index 93d8cb1e24a8..930b9b59d0d1 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -3303,10 +3303,6 @@ fn add_to_diag(self, diag: &mut Diag<'_, G>) { )] pub(crate) struct ExpectedNameValue; -#[derive(Diagnostic)] -#[diag("`#[diagnostic::do_not_recommend]` does not expect any arguments")] -pub(crate) struct DoNotRecommendDoesNotExpectArgs; - #[derive(Diagnostic)] #[diag("invalid `crate_type` value")] pub(crate) struct UnknownCrateTypes { diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index a7b0c514c430..437717a7581e 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -656,7 +656,6 @@ pub enum DeprecatedSinceKind { pub enum AttributeLintKind { UnexpectedCfgName((Symbol, Span), Option<(Symbol, Span)>), UnexpectedCfgValue((Symbol, Span), Option<(Symbol, Span)>), - DoNotRecommendDoesNotExpectArgs, CrateTypeUnknown { span: Span, suggested: Option }, MalformedDoc, ExpectedNoArgs, From 940d0f82454c1e4c732cd2397d5dc4a64c6ef7ae Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:32:24 +0200 Subject: [PATCH 6/7] Remove `AttributeLintKind::UnknownCrateTypesSuggestion` variant --- .../src/attributes/crate_level.rs | 17 +++++++++++------ compiler/rustc_attr_parsing/src/errors.rs | 15 +++++++++++++++ compiler/rustc_lint/src/early/diagnostics.rs | 5 ----- compiler/rustc_lint/src/lints.rs | 15 --------------- compiler/rustc_lint_defs/src/lib.rs | 1 - 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/crate_level.rs b/compiler/rustc_attr_parsing/src/attributes/crate_level.rs index fed4ca7e76ab..3739461c2004 100644 --- a/compiler/rustc_attr_parsing/src/attributes/crate_level.rs +++ b/compiler/rustc_attr_parsing/src/attributes/crate_level.rs @@ -1,10 +1,11 @@ +use rustc_errors::Diagnostic; use rustc_hir::attrs::{CrateType, WindowsSubsystemKind}; -use rustc_hir::lints::AttributeLintKind; use rustc_session::lint::builtin::UNKNOWN_CRATE_TYPES; use rustc_span::Symbol; use rustc_span::edit_distance::find_best_match_for_name; use super::prelude::*; +use crate::errors::{UnknownCrateTypes, UnknownCrateTypesSuggestion}; pub(crate) struct CrateNameParser; @@ -65,13 +66,17 @@ fn extend( crate_type, None, ); - cx.emit_lint( + let span = n.value_span; + cx.emit_dyn_lint( UNKNOWN_CRATE_TYPES, - AttributeLintKind::CrateTypeUnknown { - span: n.value_span, - suggested: candidate, + move |dcx, level| { + UnknownCrateTypes { + sugg: candidate + .map(|s| UnknownCrateTypesSuggestion { span, snippet: s }), + } + .into_diag(dcx, level) }, - n.value_span, + span, ); } return None; diff --git a/compiler/rustc_attr_parsing/src/errors.rs b/compiler/rustc_attr_parsing/src/errors.rs index 188f7d0578c5..96a4c473c3ae 100644 --- a/compiler/rustc_attr_parsing/src/errors.rs +++ b/compiler/rustc_attr_parsing/src/errors.rs @@ -278,6 +278,21 @@ pub(crate) struct DocTestUnknown { #[diag("`#[diagnostic::do_not_recommend]` does not expect any arguments")] pub(crate) struct DoNotRecommendDoesNotExpectArgs; +#[derive(Diagnostic)] +#[diag("invalid `crate_type` value")] +pub(crate) struct UnknownCrateTypes { + #[subdiagnostic] + pub sugg: Option, +} + +#[derive(Subdiagnostic)] +#[suggestion("did you mean", code = r#""{snippet}""#, applicability = "maybe-incorrect")] +pub(crate) struct UnknownCrateTypesSuggestion { + #[primary_span] + pub span: Span, + pub snippet: Symbol, +} + #[derive(Diagnostic)] #[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")] pub(crate) struct DiagnosticOnConstOnlyForTraitImpls { diff --git a/compiler/rustc_lint/src/early/diagnostics.rs b/compiler/rustc_lint/src/early/diagnostics.rs index e204e9211e56..60bfdd689609 100644 --- a/compiler/rustc_lint/src/early/diagnostics.rs +++ b/compiler/rustc_lint/src/early/diagnostics.rs @@ -43,11 +43,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> { .into_diag(dcx, level) } - &AttributeLintKind::CrateTypeUnknown { span, suggested } => lints::UnknownCrateTypes { - sugg: suggested.map(|s| lints::UnknownCrateTypesSuggestion { span, snippet: s }), - } - .into_diag(dcx, level), - &AttributeLintKind::MalformedDoc => lints::MalformedDoc.into_diag(dcx, level), &AttributeLintKind::ExpectedNoArgs => lints::ExpectedNoArgs.into_diag(dcx, level), diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index 930b9b59d0d1..ccbc325648e3 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -3303,21 +3303,6 @@ fn add_to_diag(self, diag: &mut Diag<'_, G>) { )] pub(crate) struct ExpectedNameValue; -#[derive(Diagnostic)] -#[diag("invalid `crate_type` value")] -pub(crate) struct UnknownCrateTypes { - #[subdiagnostic] - pub sugg: Option, -} - -#[derive(Subdiagnostic)] -#[suggestion("did you mean", code = r#""{snippet}""#, applicability = "maybe-incorrect")] -pub(crate) struct UnknownCrateTypesSuggestion { - #[primary_span] - pub span: Span, - pub snippet: Symbol, -} - #[derive(Diagnostic)] #[diag("positional format arguments are not allowed here")] #[help( diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 437717a7581e..45ac2c59b04e 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -656,7 +656,6 @@ pub enum DeprecatedSinceKind { pub enum AttributeLintKind { UnexpectedCfgName((Symbol, Span), Option<(Symbol, Span)>), UnexpectedCfgValue((Symbol, Span), Option<(Symbol, Span)>), - CrateTypeUnknown { span: Span, suggested: Option }, MalformedDoc, ExpectedNoArgs, ExpectedNameValue, From 80777dd74884c1898a639afd1d93fb8cfd9bcde4 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Apr 2026 12:54:20 +0200 Subject: [PATCH 7/7] Reorder emails of Guillaume Gomez so it appears as its primary email and not the old one --- .mailmap | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.mailmap b/.mailmap index 17232083679c..c29f6a66f5d7 100644 --- a/.mailmap +++ b/.mailmap @@ -258,11 +258,11 @@ Greg V Gregor Peach Grzegorz Bartoszek Guanqun Lu -Guillaume Gomez -Guillaume Gomez ggomez -Guillaume Gomez Guillaume Gomez -Guillaume Gomez Guillaume Gomez -Guillaume Gomez Guillaume Gomez +Guillaume Gomez +Guillaume Gomez Guillaume Gomez +Guillaume Gomez ggomez +Guillaume Gomez Guillaume Gomez +Guillaume Gomez Guillaume Gomez gnzlbg hamidreza kalbasi Hanna Kruppe