@@ -24,7 +24,9 @@ use rustc_hir::def_id::{CrateNum, LocalDefId};
2424use rustc_middle:: middle:: stability;
2525use rustc_middle:: ty:: RegisteredTools ;
2626use rustc_middle:: ty:: TyCtxt ;
27- use rustc_session:: lint:: builtin:: { LEGACY_DERIVE_HELPERS , SOFT_UNSTABLE } ;
27+ use rustc_session:: lint:: builtin:: {
28+ LEGACY_DERIVE_HELPERS , SOFT_UNSTABLE , UNKNOWN_DIAGNOSTIC_ATTRIBUTES ,
29+ } ;
2830use rustc_session:: lint:: builtin:: { UNUSED_MACROS , UNUSED_MACRO_RULES } ;
2931use rustc_session:: lint:: BuiltinLintDiagnostics ;
3032use rustc_session:: parse:: feature_err;
@@ -140,9 +142,9 @@ pub(crate) fn registered_tools(tcx: TyCtxt<'_>, (): ()) -> RegisteredTools {
140142 }
141143 }
142144 }
143- // We implicitly add `rustfmt` and `clippy` to known tools,
145+ // We implicitly add `rustfmt`, `clippy`, `diagnostic ` to known tools,
144146 // but it's not an error to register them explicitly.
145- let predefined_tools = [ sym:: clippy, sym:: rustfmt] ;
147+ let predefined_tools = [ sym:: clippy, sym:: rustfmt, sym :: diagnostic ] ;
146148 registered_tools. extend ( predefined_tools. iter ( ) . cloned ( ) . map ( Ident :: with_dummy_span) ) ;
147149 registered_tools
148150}
@@ -595,6 +597,18 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
595597 }
596598 }
597599
600+ if res == Res :: NonMacroAttr ( NonMacroAttrKind :: Tool )
601+ && path. segments . len ( ) >= 2
602+ && path. segments [ 0 ] . ident . name == sym:: diagnostic
603+ {
604+ self . tcx . sess . parse_sess . buffer_lint (
605+ UNKNOWN_DIAGNOSTIC_ATTRIBUTES ,
606+ path. segments [ 1 ] . span ( ) ,
607+ node_id,
608+ "unknown diagnostic attribute" ,
609+ ) ;
610+ }
611+
598612 Ok ( ( ext, res) )
599613 }
600614
0 commit comments