1
- // This implements the dead-code warning pass. It follows crate::reachable
2
- // closely. The idea is that all reachable symbols are live, codes called
3
- // from live codes are live, and everything else is dead.
1
+ // This implements the dead-code warning pass.
2
+ // All reachable symbols are live, code called from live code is live, code with certain lint
3
+ // expectations such as `#[expect(unused)]` and `#[expect(dead_code)]` is live, and everything else
4
+ // is dead.
4
5
5
6
use hir:: def_id:: { LocalDefIdMap , LocalDefIdSet } ;
6
7
use itertools:: Itertools ;
@@ -685,7 +686,7 @@ fn live_symbols_and_ignored_derived_traits(
685
686
( symbol_visitor. live_symbols , symbol_visitor. ignored_derived_traits )
686
687
}
687
688
688
- struct DeadVariant {
689
+ struct DeadItem {
689
690
def_id : LocalDefId ,
690
691
name : Symbol ,
691
692
level : lint:: Level ,
@@ -729,7 +730,7 @@ impl<'tcx> DeadVisitor<'tcx> {
729
730
// first local def id.
730
731
// Prefer calling `Self.warn_dead_code` or `Self.warn_dead_code_grouped_by_lint_level`
731
732
// since those methods group by lint level before calling this method.
732
- fn warn_multiple_dead_codes (
733
+ fn lint_at_single_level (
733
734
& self ,
734
735
dead_codes : & [ LocalDefId ] ,
735
736
participle : & str ,
@@ -832,23 +833,23 @@ impl<'tcx> DeadVisitor<'tcx> {
832
833
self . tcx . emit_spanned_lint ( lint, first_hir_id, MultiSpan :: from_spans ( spans) , diag) ;
833
834
}
834
835
835
- fn warn_dead_code_grouped_by_lint_level (
836
+ fn warn_multiple (
836
837
& self ,
837
838
def_id : LocalDefId ,
838
839
participle : & str ,
839
- dead_codes : Vec < DeadVariant > ,
840
+ dead_codes : Vec < DeadItem > ,
840
841
is_positional : bool ,
841
842
) {
842
843
let mut dead_codes = dead_codes
843
844
. iter ( )
844
845
. filter ( |v| !v. name . as_str ( ) . starts_with ( '_' ) )
845
- . collect :: < Vec < & DeadVariant > > ( ) ;
846
+ . collect :: < Vec < & DeadItem > > ( ) ;
846
847
if dead_codes. is_empty ( ) {
847
848
return ;
848
849
}
849
850
dead_codes. sort_by_key ( |v| v. level ) ;
850
851
for ( _, group) in & dead_codes. into_iter ( ) . group_by ( |v| v. level ) {
851
- self . warn_multiple_dead_codes (
852
+ self . lint_at_single_level (
852
853
& group. map ( |v| v. def_id ) . collect :: < Vec < _ > > ( ) ,
853
854
participle,
854
855
Some ( def_id) ,
@@ -858,7 +859,7 @@ impl<'tcx> DeadVisitor<'tcx> {
858
859
}
859
860
860
861
fn warn_dead_code ( & mut self , id : LocalDefId , participle : & str ) {
861
- self . warn_multiple_dead_codes ( & [ id] , participle, None , false ) ;
862
+ self . lint_at_single_level ( & [ id] , participle, None , false ) ;
862
863
}
863
864
864
865
fn check_definition ( & mut self , def_id : LocalDefId ) {
@@ -907,13 +908,13 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalDefId) {
907
908
let def_id = item. id . owner_id . def_id ;
908
909
if !visitor. is_live_code ( def_id) {
909
910
let name = tcx. item_name ( def_id. to_def_id ( ) ) ;
910
- let hir = tcx. hir ( ) . local_def_id_to_hir_id ( def_id) ;
911
- let level = tcx. lint_level_at_node ( lint:: builtin:: DEAD_CODE , hir ) . 0 ;
911
+ let hir_id = tcx. hir ( ) . local_def_id_to_hir_id ( def_id) ;
912
+ let level = tcx. lint_level_at_node ( lint:: builtin:: DEAD_CODE , hir_id ) . 0 ;
912
913
913
- dead_items. push ( DeadVariant { def_id, name, level } )
914
+ dead_items. push ( DeadItem { def_id, name, level } )
914
915
}
915
916
}
916
- visitor. warn_dead_code_grouped_by_lint_level (
917
+ visitor. warn_multiple (
917
918
item. owner_id . def_id ,
918
919
"used" ,
919
920
dead_items,
@@ -942,7 +943,7 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalDefId) {
942
943
// Record to group diagnostics.
943
944
let hir_id = tcx. hir ( ) . local_def_id_to_hir_id ( def_id) ;
944
945
let level = tcx. lint_level_at_node ( lint:: builtin:: DEAD_CODE , hir_id) . 0 ;
945
- dead_variants. push ( DeadVariant { def_id, name : variant. name , level } ) ;
946
+ dead_variants. push ( DeadItem { def_id, name : variant. name , level } ) ;
946
947
continue ;
947
948
}
948
949
@@ -967,21 +968,21 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalDefId) {
967
968
hir_id,
968
969
)
969
970
. 0 ;
970
- Some ( DeadVariant { def_id, name : field. name , level } )
971
+ Some ( DeadItem { def_id, name : field. name , level } )
971
972
} else {
972
973
None
973
974
}
974
975
} )
975
976
. collect ( ) ;
976
- visitor. warn_dead_code_grouped_by_lint_level (
977
+ visitor. warn_multiple (
977
978
def_id,
978
979
"read" ,
979
980
dead_fields,
980
981
is_positional,
981
982
)
982
983
}
983
984
984
- visitor. warn_dead_code_grouped_by_lint_level (
985
+ visitor. warn_multiple (
985
986
item. owner_id . def_id ,
986
987
"constructed" ,
987
988
dead_variants,
0 commit comments