@@ -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