@@ -24,7 +24,9 @@ use rustc_hir::def_id::{CrateNum, LocalDefId};
24
24
use rustc_middle:: middle:: stability;
25
25
use rustc_middle:: ty:: RegisteredTools ;
26
26
use 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
+ } ;
28
30
use rustc_session:: lint:: builtin:: { UNUSED_MACROS , UNUSED_MACRO_RULES } ;
29
31
use rustc_session:: lint:: BuiltinLintDiagnostics ;
30
32
use rustc_session:: parse:: feature_err;
@@ -140,9 +142,9 @@ pub(crate) fn registered_tools(tcx: TyCtxt<'_>, (): ()) -> RegisteredTools {
140
142
}
141
143
}
142
144
}
143
- // We implicitly add `rustfmt` and `clippy` to known tools,
145
+ // We implicitly add `rustfmt`, `clippy`, `diagnostic ` to known tools,
144
146
// 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 ] ;
146
148
registered_tools. extend ( predefined_tools. iter ( ) . cloned ( ) . map ( Ident :: with_dummy_span) ) ;
147
149
registered_tools
148
150
}
@@ -595,6 +597,18 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
595
597
}
596
598
}
597
599
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
+
598
612
Ok ( ( ext, res) )
599
613
}
600
614
0 commit comments