@@ -89,11 +89,10 @@ use rustc_data_structures::fx::FxIndexMap;
8989use rustc_errors:: Applicability ;
9090use rustc_hir as hir;
9191use rustc_hir:: def:: * ;
92- use rustc_hir:: def_id:: LocalDefId ;
92+ use rustc_hir:: def_id:: { DefId , LocalDefId } ;
9393use rustc_hir:: intravisit:: { self , Visitor } ;
9494use rustc_hir:: { Expr , HirId , HirIdMap , HirIdSet } ;
9595use rustc_index:: vec:: IndexVec ;
96- use rustc_middle:: hir:: nested_filter;
9796use rustc_middle:: ty:: query:: Providers ;
9897use rustc_middle:: ty:: { self , DefIdTree , RootVariableMinCaptureList , Ty , TyCtxt } ;
9998use rustc_session:: lint;
@@ -139,12 +138,54 @@ fn live_node_kind_to_string(lnk: LiveNodeKind, tcx: TyCtxt<'_>) -> String {
139138 }
140139}
141140
142- fn check_mod_liveness ( tcx : TyCtxt < ' _ > , module_def_id : LocalDefId ) {
143- tcx. hir ( ) . visit_item_likes_in_module ( module_def_id, & mut IrMaps :: new ( tcx) ) ;
141+ fn check_liveness ( tcx : TyCtxt < ' _ > , def_id : DefId ) {
142+ let local_def_id = match def_id. as_local ( ) {
143+ None => return ,
144+ Some ( def_id) => def_id,
145+ } ;
146+
147+ // Don't run unused pass for #[derive()]
148+ let parent = tcx. local_parent ( local_def_id) ;
149+ if let DefKind :: Impl = tcx. def_kind ( parent)
150+ && tcx. has_attr ( parent. to_def_id ( ) , sym:: automatically_derived)
151+ {
152+ return ;
153+ }
154+
155+ // Don't run unused pass for #[naked]
156+ if tcx. has_attr ( def_id, sym:: naked) {
157+ return ;
158+ }
159+
160+ let mut maps = IrMaps :: new ( tcx) ;
161+ let body_id = tcx. hir ( ) . body_owned_by ( local_def_id) ;
162+ let hir_id = tcx. hir ( ) . body_owner ( body_id) ;
163+ let body = tcx. hir ( ) . body ( body_id) ;
164+
165+ if let Some ( upvars) = tcx. upvars_mentioned ( def_id) {
166+ for & var_hir_id in upvars. keys ( ) {
167+ let var_name = tcx. hir ( ) . name ( var_hir_id) ;
168+ maps. add_variable ( Upvar ( var_hir_id, var_name) ) ;
169+ }
170+ }
171+
172+ // gather up the various local variables, significant expressions,
173+ // and so forth:
174+ maps. visit_body ( body) ;
175+
176+ // compute liveness
177+ let mut lsets = Liveness :: new ( & mut maps, local_def_id) ;
178+ let entry_ln = lsets. compute ( & body, hir_id) ;
179+ lsets. log_liveness ( entry_ln, body_id. hir_id ) ;
180+
181+ // check for various error conditions
182+ lsets. visit_body ( body) ;
183+ lsets. warn_about_unused_upvars ( entry_ln) ;
184+ lsets. warn_about_unused_args ( body, entry_ln) ;
144185}
145186
146187pub fn provide ( providers : & mut Providers ) {
147- * providers = Providers { check_mod_liveness , ..* providers } ;
188+ * providers = Providers { check_liveness , ..* providers } ;
148189}
149190
150191// ______________________________________________________________________
@@ -316,56 +357,6 @@ impl<'tcx> IrMaps<'tcx> {
316357}
317358
318359impl < ' tcx > Visitor < ' tcx > for IrMaps < ' tcx > {
319- type NestedFilter = nested_filter:: OnlyBodies ;
320-
321- fn nested_visit_map ( & mut self ) -> Self :: Map {
322- self . tcx . hir ( )
323- }
324-
325- fn visit_body ( & mut self , body : & ' tcx hir:: Body < ' tcx > ) {
326- debug ! ( "visit_body {:?}" , body. id( ) ) ;
327-
328- // swap in a new set of IR maps for this body
329- let mut maps = IrMaps :: new ( self . tcx ) ;
330- let hir_id = maps. tcx . hir ( ) . body_owner ( body. id ( ) ) ;
331- let local_def_id = maps. tcx . hir ( ) . local_def_id ( hir_id) ;
332- let def_id = local_def_id. to_def_id ( ) ;
333-
334- // Don't run unused pass for #[derive()]
335- let parent = self . tcx . local_parent ( local_def_id) ;
336- if let DefKind :: Impl = self . tcx . def_kind ( parent)
337- && self . tcx . has_attr ( parent. to_def_id ( ) , sym:: automatically_derived)
338- {
339- return ;
340- }
341-
342- // Don't run unused pass for #[naked]
343- if self . tcx . has_attr ( def_id, sym:: naked) {
344- return ;
345- }
346-
347- if let Some ( upvars) = maps. tcx . upvars_mentioned ( def_id) {
348- for & var_hir_id in upvars. keys ( ) {
349- let var_name = maps. tcx . hir ( ) . name ( var_hir_id) ;
350- maps. add_variable ( Upvar ( var_hir_id, var_name) ) ;
351- }
352- }
353-
354- // gather up the various local variables, significant expressions,
355- // and so forth:
356- intravisit:: walk_body ( & mut maps, body) ;
357-
358- // compute liveness
359- let mut lsets = Liveness :: new ( & mut maps, local_def_id) ;
360- let entry_ln = lsets. compute ( & body, hir_id) ;
361- lsets. log_liveness ( entry_ln, body. id ( ) . hir_id ) ;
362-
363- // check for various error conditions
364- lsets. visit_body ( body) ;
365- lsets. warn_about_unused_upvars ( entry_ln) ;
366- lsets. warn_about_unused_args ( body, entry_ln) ;
367- }
368-
369360 fn visit_local ( & mut self , local : & ' tcx hir:: Local < ' tcx > ) {
370361 self . add_from_pat ( & local. pat ) ;
371362 if local. els . is_some ( ) {
0 commit comments