14
14
15
15
use front:: map as ast_map;
16
16
use rustc_front:: hir;
17
- use rustc_front:: visit :: { self , Visitor } ;
17
+ use rustc_front:: intravisit :: { self , Visitor } ;
18
18
19
19
use middle:: { def, pat_util, privacy, ty} ;
20
20
use middle:: def_id:: { DefId } ;
@@ -182,29 +182,29 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
182
182
. contains ( & attr:: ReprExtern )
183
183
} ) ;
184
184
185
- visit :: walk_item ( self , & * item) ;
185
+ intravisit :: walk_item ( self , & * item) ;
186
186
}
187
187
hir:: ItemEnum ( ..) => {
188
188
self . inherited_pub_visibility = item. vis == hir:: Public ;
189
- visit :: walk_item ( self , & * item) ;
189
+ intravisit :: walk_item ( self , & * item) ;
190
190
}
191
191
hir:: ItemFn ( ..)
192
192
| hir:: ItemTy ( ..)
193
193
| hir:: ItemStatic ( ..)
194
194
| hir:: ItemConst ( ..) => {
195
- visit :: walk_item ( self , & * item) ;
195
+ intravisit :: walk_item ( self , & * item) ;
196
196
}
197
197
_ => ( )
198
198
}
199
199
}
200
200
ast_map:: NodeTraitItem ( trait_item) => {
201
- visit :: walk_trait_item ( self , trait_item) ;
201
+ intravisit :: walk_trait_item ( self , trait_item) ;
202
202
}
203
203
ast_map:: NodeImplItem ( impl_item) => {
204
- visit :: walk_impl_item ( self , impl_item) ;
204
+ intravisit :: walk_impl_item ( self , impl_item) ;
205
205
}
206
206
ast_map:: NodeForeignItem ( foreign_item) => {
207
- visit :: walk_foreign_item ( self , & * foreign_item) ;
207
+ intravisit :: walk_foreign_item ( self , & * foreign_item) ;
208
208
}
209
209
_ => ( )
210
210
}
@@ -227,7 +227,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
227
227
} ) ;
228
228
self . live_symbols . extend ( live_fields. map ( |f| f. node . id ) ) ;
229
229
230
- visit :: walk_struct_def ( self , def) ;
230
+ intravisit :: walk_struct_def ( self , def) ;
231
231
}
232
232
233
233
fn visit_expr ( & mut self , expr : & hir:: Expr ) {
@@ -244,7 +244,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
244
244
_ => ( )
245
245
}
246
246
247
- visit :: walk_expr ( self , expr) ;
247
+ intravisit :: walk_expr ( self , expr) ;
248
248
}
249
249
250
250
fn visit_arm ( & mut self , arm : & hir:: Arm ) {
@@ -257,10 +257,10 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
257
257
// can't be reached unless the variant is constructed elsewhere.
258
258
let len = self . ignore_variant_stack . len ( ) ;
259
259
self . ignore_variant_stack . push_all ( & * variants) ;
260
- visit :: walk_arm ( self , arm) ;
260
+ intravisit :: walk_arm ( self , arm) ;
261
261
self . ignore_variant_stack . truncate ( len) ;
262
262
} else {
263
- visit :: walk_arm ( self , arm) ;
263
+ intravisit :: walk_arm ( self , arm) ;
264
264
}
265
265
}
266
266
@@ -278,23 +278,18 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
278
278
}
279
279
280
280
self . ignore_non_const_paths = true ;
281
- visit :: walk_pat ( self , pat) ;
281
+ intravisit :: walk_pat ( self , pat) ;
282
282
self . ignore_non_const_paths = false ;
283
283
}
284
284
285
285
fn visit_path ( & mut self , path : & hir:: Path , id : ast:: NodeId ) {
286
286
self . lookup_and_handle_definition ( & id) ;
287
- visit :: walk_path ( self , path) ;
287
+ intravisit :: walk_path ( self , path) ;
288
288
}
289
289
290
290
fn visit_path_list_item ( & mut self , path : & hir:: Path , item : & hir:: PathListItem ) {
291
291
self . lookup_and_handle_definition ( & item. node . id ( ) ) ;
292
- visit:: walk_path_list_item ( self , path, item) ;
293
- }
294
-
295
- fn visit_item ( & mut self , _: & hir:: Item ) {
296
- // Do not recurse into items. These items will be added to the
297
- // worklist and recursed into manually if necessary.
292
+ intravisit:: walk_path_list_item ( self , path, item) ;
298
293
}
299
294
}
300
295
@@ -371,7 +366,6 @@ impl<'v> Visitor<'v> for LifeSeeder {
371
366
}
372
367
_ => ( )
373
368
}
374
- visit:: walk_item ( self , item) ;
375
369
}
376
370
}
377
371
@@ -408,7 +402,7 @@ fn create_and_seed_worklist(tcx: &ty::ctxt,
408
402
let mut life_seeder = LifeSeeder {
409
403
worklist : worklist
410
404
} ;
411
- visit :: walk_crate ( & mut life_seeder, krate ) ;
405
+ krate . visit_all_items ( & mut life_seeder) ;
412
406
413
407
return life_seeder. worklist ;
414
408
}
@@ -530,6 +524,14 @@ impl<'a, 'tcx> DeadVisitor<'a, 'tcx> {
530
524
}
531
525
532
526
impl < ' a , ' tcx , ' v > Visitor < ' v > for DeadVisitor < ' a , ' tcx > {
527
+ /// Walk nested items in place so that we don't report dead-code
528
+ /// on inner functions when the outer function is already getting
529
+ /// an error. We could do this also by checking the parents, but
530
+ /// this is how the code is setup and it seems harmless enough.
531
+ fn visit_nested_item ( & mut self , item : hir:: ItemId ) {
532
+ self . visit_item ( self . tcx . map . expect_item ( item. id ) )
533
+ }
534
+
533
535
fn visit_item ( & mut self , item : & hir:: Item ) {
534
536
if self . should_warn_about_item ( item) {
535
537
self . warn_dead_code (
@@ -540,7 +542,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
540
542
) ;
541
543
} else {
542
544
// Only continue if we didn't warn
543
- visit :: walk_item ( self , item) ;
545
+ intravisit :: walk_item ( self , item) ;
544
546
}
545
547
}
546
548
@@ -549,15 +551,15 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
549
551
self . warn_dead_code ( variant. node . data . id ( ) , variant. span ,
550
552
variant. node . name , "variant" ) ;
551
553
} else {
552
- visit :: walk_variant ( self , variant, g, id) ;
554
+ intravisit :: walk_variant ( self , variant, g, id) ;
553
555
}
554
556
}
555
557
556
558
fn visit_foreign_item ( & mut self , fi : & hir:: ForeignItem ) {
557
559
if !self . symbol_is_live ( fi. id , None ) {
558
560
self . warn_dead_code ( fi. id , fi. span , fi. name , fi. node . descriptive_variant ( ) ) ;
559
561
}
560
- visit :: walk_foreign_item ( self , fi) ;
562
+ intravisit :: walk_foreign_item ( self , fi) ;
561
563
}
562
564
563
565
fn visit_struct_field ( & mut self , field : & hir:: StructField ) {
@@ -566,7 +568,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
566
568
field. node . name ( ) . unwrap ( ) , "struct field" ) ;
567
569
}
568
570
569
- visit :: walk_struct_field ( self , field) ;
571
+ intravisit :: walk_struct_field ( self , field) ;
570
572
}
571
573
572
574
fn visit_impl_item ( & mut self , impl_item : & hir:: ImplItem ) {
@@ -576,14 +578,14 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
576
578
self . warn_dead_code ( impl_item. id , impl_item. span ,
577
579
impl_item. name , "associated const" ) ;
578
580
}
579
- visit :: walk_expr ( self , expr)
581
+ intravisit :: walk_expr ( self , expr)
580
582
}
581
583
hir:: ImplItemKind :: Method ( _, ref body) => {
582
584
if !self . symbol_is_live ( impl_item. id , None ) {
583
585
self . warn_dead_code ( impl_item. id , impl_item. span ,
584
586
impl_item. name , "method" ) ;
585
587
}
586
- visit :: walk_block ( self , body)
588
+ intravisit :: walk_block ( self , body)
587
589
}
588
590
hir:: ImplItemKind :: Type ( ..) => { }
589
591
}
@@ -593,10 +595,10 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
593
595
fn visit_trait_item ( & mut self , trait_item : & hir:: TraitItem ) {
594
596
match trait_item. node {
595
597
hir:: ConstTraitItem ( _, Some ( ref expr) ) => {
596
- visit :: walk_expr ( self , expr)
598
+ intravisit :: walk_expr ( self , expr)
597
599
}
598
600
hir:: MethodTraitItem ( _, Some ( ref body) ) => {
599
- visit :: walk_block ( self , body)
601
+ intravisit :: walk_block ( self , body)
600
602
}
601
603
hir:: ConstTraitItem ( _, None ) |
602
604
hir:: MethodTraitItem ( _, None ) |
@@ -612,5 +614,5 @@ pub fn check_crate(tcx: &ty::ctxt,
612
614
let live_symbols = find_live ( tcx, exported_items,
613
615
reachable_symbols, krate) ;
614
616
let mut visitor = DeadVisitor { tcx : tcx, live_symbols : live_symbols } ;
615
- visit :: walk_crate ( & mut visitor, krate) ;
617
+ intravisit :: walk_crate ( & mut visitor, krate) ;
616
618
}
0 commit comments