@@ -13,8 +13,8 @@ use rustc_hir::diagnostic_items::DiagnosticItems;
1313use rustc_hir:: { CRATE_OWNER_ID , OwnerId , find_attr} ;
1414use rustc_middle:: query:: { LocalCrate , Providers } ;
1515use rustc_middle:: ty:: TyCtxt ;
16- use rustc_span:: Symbol ;
1716use rustc_span:: def_id:: { DefId , LOCAL_CRATE } ;
17+ use rustc_span:: { Symbol , sym} ;
1818
1919use crate :: diagnostics:: DuplicateDiagnosticItemInCrate ;
2020
@@ -53,15 +53,19 @@ fn report_duplicate_item(
5353 } ) ;
5454}
5555
56- /// Traverse and collect the diagnostic items in the current
56+ /// Traverse and collect the diagnostic items in the current crate
5757fn diagnostic_items ( tcx : TyCtxt < ' _ > , _: LocalCrate ) -> DiagnosticItems {
5858 // Initialize the collector.
5959 let mut diagnostic_items = DiagnosticItems :: default ( ) ;
6060
61- // Collect diagnostic items in this crate.
62- let crate_items = tcx. hir_crate_items ( ( ) ) ;
63- for id in crate_items. owners ( ) . chain ( std:: iter:: once ( CRATE_OWNER_ID ) ) {
64- observe_item ( tcx, & mut diagnostic_items, id) ;
61+ // Optimization: can this crate even define diagnostic items?
62+ // (But do not mark `rustc_attrs` as used while doing so)
63+ if tcx. features ( ) . enabled_features ( ) . contains ( & sym:: rustc_attrs) {
64+ // Collect diagnostic items in this crate.
65+ let crate_items = tcx. hir_crate_items ( ( ) ) ;
66+ for id in crate_items. owners ( ) . chain ( std:: iter:: once ( CRATE_OWNER_ID ) ) {
67+ observe_item ( tcx, & mut diagnostic_items, id) ;
68+ }
6569 }
6670
6771 diagnostic_items
0 commit comments