@@ -89,11 +89,10 @@ use rustc_data_structures::fx::FxIndexMap;
89
89
use rustc_errors:: Applicability ;
90
90
use rustc_hir as hir;
91
91
use rustc_hir:: def:: * ;
92
- use rustc_hir:: def_id:: LocalDefId ;
92
+ use rustc_hir:: def_id:: { DefId , LocalDefId } ;
93
93
use rustc_hir:: intravisit:: { self , Visitor } ;
94
94
use rustc_hir:: { Expr , HirId , HirIdMap , HirIdSet } ;
95
95
use rustc_index:: vec:: IndexVec ;
96
- use rustc_middle:: hir:: nested_filter;
97
96
use rustc_middle:: ty:: query:: Providers ;
98
97
use rustc_middle:: ty:: { self , DefIdTree , RootVariableMinCaptureList , Ty , TyCtxt } ;
99
98
use rustc_session:: lint;
@@ -139,12 +138,54 @@ fn live_node_kind_to_string(lnk: LiveNodeKind, tcx: TyCtxt<'_>) -> String {
139
138
}
140
139
}
141
140
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) ;
144
185
}
145
186
146
187
pub fn provide ( providers : & mut Providers ) {
147
- * providers = Providers { check_mod_liveness , ..* providers } ;
188
+ * providers = Providers { check_liveness , ..* providers } ;
148
189
}
149
190
150
191
// ______________________________________________________________________
@@ -316,56 +357,6 @@ impl<'tcx> IrMaps<'tcx> {
316
357
}
317
358
318
359
impl < ' 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
-
369
360
fn visit_local ( & mut self , local : & ' tcx hir:: Local < ' tcx > ) {
370
361
self . add_from_pat ( & local. pat ) ;
371
362
if local. els . is_some ( ) {
0 commit comments