@@ -506,6 +506,13 @@ fn find_live<'tcx>(
506506 symbol_visitor. live_symbols
507507}
508508
509+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
510+ enum ExtraNote {
511+ /// Use this to provide some examples in the diagnostic of potential other purposes for a value
512+ /// or field that is dead code
513+ OtherPurposeExamples ,
514+ }
515+
509516struct DeadVisitor < ' tcx > {
510517 tcx : TyCtxt < ' tcx > ,
511518 live_symbols : FxHashSet < hir:: HirId > ,
@@ -573,6 +580,7 @@ impl DeadVisitor<'tcx> {
573580 span : rustc_span:: Span ,
574581 name : Symbol ,
575582 participle : & str ,
583+ extra_note : Option < ExtraNote > ,
576584 ) {
577585 if !name. as_str ( ) . starts_with ( '_' ) {
578586 self . tcx . struct_span_lint_hir ( lint:: builtin:: DEAD_CODE , id, span, |lint| {
@@ -583,19 +591,26 @@ impl DeadVisitor<'tcx> {
583591
584592 let mut diag =
585593 lint. build ( & format ! ( "{} is never {}: `{}`" , descr, participle, name) ) ;
594+
586595 diag. multipart_suggestion (
587596 "if this is intentional, prefix it with an underscore" ,
588597 prefixed,
589598 Applicability :: MachineApplicable ,
590- )
591- . note ( & format ! (
592- "The leading underscore signals to the reader that while the {} may not be {}\n \
593- by any Rust code, it still serves some other purpose that isn't detected by rustc.\n \
594- (e.g. some values are used for their effect when dropped or used in FFI code\n \
595- exclusively through raw pointers)",
596- descr, participle,
597- ) ) ;
599+ ) ;
600+
601+ let mut note = format ! (
602+ "the leading underscore signals that this {} serves some other \
603+ purpose\n even if it isn't used in a way that we can detect.",
604+ descr,
605+ ) ;
606+ if matches ! ( extra_note, Some ( ExtraNote :: OtherPurposeExamples ) ) {
607+ note += " (e.g. for its effect\n when dropped or in foreign code)" ;
608+ }
609+
610+ diag. note ( & note) ;
611+
598612 // Force the note we added to the front, before any other subdiagnostics
613+ // added in lint.build(...)
599614 diag. children . rotate_right ( 1 ) ;
600615
601616 diag. emit ( )
@@ -644,7 +659,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
644659 hir:: ItemKind :: Struct ( ..) => "constructed" , // Issue #52325
645660 _ => "used" ,
646661 } ;
647- self . warn_dead_code ( item. hir_id ( ) , span, item. ident . name , participle) ;
662+ self . warn_dead_code ( item. hir_id ( ) , span, item. ident . name , participle, None ) ;
648663 } else {
649664 // Only continue if we didn't warn
650665 intravisit:: walk_item ( self , item) ;
@@ -658,22 +673,28 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
658673 id : hir:: HirId ,
659674 ) {
660675 if self . should_warn_about_variant ( & variant) {
661- self . warn_dead_code ( variant. id , variant. span , variant. ident . name , "constructed" ) ;
676+ self . warn_dead_code ( variant. id , variant. span , variant. ident . name , "constructed" , None ) ;
662677 } else {
663678 intravisit:: walk_variant ( self , variant, g, id) ;
664679 }
665680 }
666681
667682 fn visit_foreign_item ( & mut self , fi : & ' tcx hir:: ForeignItem < ' tcx > ) {
668683 if self . should_warn_about_foreign_item ( fi) {
669- self . warn_dead_code ( fi. hir_id ( ) , fi. span , fi. ident . name , "used" ) ;
684+ self . warn_dead_code ( fi. hir_id ( ) , fi. span , fi. ident . name , "used" , None ) ;
670685 }
671686 intravisit:: walk_foreign_item ( self , fi) ;
672687 }
673688
674689 fn visit_field_def ( & mut self , field : & ' tcx hir:: FieldDef < ' tcx > ) {
675690 if self . should_warn_about_field ( & field) {
676- self . warn_dead_code ( field. hir_id , field. span , field. ident . name , "read" ) ;
691+ self . warn_dead_code (
692+ field. hir_id ,
693+ field. span ,
694+ field. ident . name ,
695+ "read" ,
696+ Some ( ExtraNote :: OtherPurposeExamples ) ,
697+ ) ;
677698 }
678699 intravisit:: walk_field_def ( self , field) ;
679700 }
@@ -687,6 +708,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
687708 impl_item. span ,
688709 impl_item. ident . name ,
689710 "used" ,
711+ None ,
690712 ) ;
691713 }
692714 self . visit_nested_body ( body_id)
@@ -704,7 +726,13 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
704726 } else {
705727 impl_item. ident . span
706728 } ;
707- self . warn_dead_code ( impl_item. hir_id ( ) , span, impl_item. ident . name , "used" ) ;
729+ self . warn_dead_code (
730+ impl_item. hir_id ( ) ,
731+ span,
732+ impl_item. ident . name ,
733+ "used" ,
734+ None ,
735+ ) ;
708736 }
709737 self . visit_nested_body ( body_id)
710738 }
0 commit comments