@@ -133,19 +133,21 @@ fn unused_crates_lint<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) {
133133
134134        // If the crate is fully unused, we suggest removing it altogether. 
135135        // We do this in any edition. 
136-         if  let  Some ( & span)  = unused_extern_crates. get ( & extern_crate. def_id )  { 
137-             assert_eq ! ( extern_crate. def_id. krate,  LOCAL_CRATE ) ; 
138-             let  hir_id = tcx. hir . definitions ( ) . def_index_to_hir_id ( extern_crate. def_id . index ) ; 
139-             let  id = tcx. hir . hir_to_node_id ( hir_id) ; 
140-             let  msg = "unused extern crate" ; 
141-             tcx. struct_span_lint_node ( lint,  id,  span,  msg) 
142-                 . span_suggestion_short_with_applicability ( 
143-                     span, 
144-                     "remove it" , 
145-                     String :: new ( ) , 
146-                     Applicability :: MachineApplicable ) 
147-                 . emit ( ) ; 
148-             continue ; 
136+         if  extern_crate. warn_if_unused  { 
137+             if  let  Some ( & span)  = unused_extern_crates. get ( & extern_crate. def_id )  { 
138+                 assert_eq ! ( extern_crate. def_id. krate,  LOCAL_CRATE ) ; 
139+                 let  hir_id = tcx. hir . definitions ( ) . def_index_to_hir_id ( extern_crate. def_id . index ) ; 
140+                 let  id = tcx. hir . hir_to_node_id ( hir_id) ; 
141+                 let  msg = "unused extern crate" ; 
142+                 tcx. struct_span_lint_node ( lint,  id,  span,  msg) 
143+                     . span_suggestion_short_with_applicability ( 
144+                         span, 
145+                         "remove it" , 
146+                         String :: new ( ) , 
147+                         Applicability :: MachineApplicable ) 
148+                     . emit ( ) ; 
149+                 continue ; 
150+             } 
149151        } 
150152
151153        // If we are not in Rust 2018 edition, then we don't make any further 
@@ -202,6 +204,10 @@ struct ExternCrateToLint {
202204     /// crate_name`), and -- perhaps surprisingly -- this stores the 
203205     /// *original* name (`item.name` will contain the new name) 
204206     orig_name :  Option < ast:: Name > , 
207+ 
208+     /// if `false`, the original name started with `_`, so we shouldn't lint 
209+      /// about it going unused (but we should still emit idiom lints). 
210+      warn_if_unused :  bool , 
205211} 
206212
207213impl < ' a ,  ' tcx ,  ' v >  ItemLikeVisitor < ' v >  for  CollectExternCrateVisitor < ' a ,  ' tcx >  { 
@@ -213,6 +219,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for CollectExternCrateVisitor<'a, 'tcx> {
213219                    def_id :  extern_crate_def_id, 
214220                    span :  item. span , 
215221                    orig_name, 
222+                     warn_if_unused :  !item. name . as_str ( ) . starts_with ( '_' ) , 
216223                } 
217224            ) ; 
218225        } 
0 commit comments