about summary refs log tree commit diff
path: root/compiler/rustc_passes
diff options
context:
space:
mode:
authorChinedu Francis Nwafili <frankie.nwafili@gmail.com>2023-09-12 03:11:11 -0400
committerChinedu Francis Nwafili <frankie.nwafili@gmail.com>2023-09-12 03:11:11 -0400
commit7db9c3c1a6ef12e3402c1cf439a203faeab1ca2c (patch)
tree9ed4b07fad90e0124ac73fa5c74f3ccceca10873 /compiler/rustc_passes
parent8ad46b49a29a9a02cf5886051925b31ab5d80c82 (diff)
downloadrust-7db9c3c1a6ef12e3402c1cf439a203faeab1ca2c.tar.gz
rust-7db9c3c1a6ef12e3402c1cf439a203faeab1ca2c.zip
Tests passing
Diffstat (limited to 'compiler/rustc_passes')
-rw-r--r--compiler/rustc_passes/src/dead.rs34
1 files changed, 20 insertions, 14 deletions
diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs
index 486bb3f2e15..3af34840af5 100644
--- a/compiler/rustc_passes/src/dead.rs
+++ b/compiler/rustc_passes/src/dead.rs
@@ -723,6 +723,12 @@ impl<'tcx> DeadVisitor<'tcx> {
         ShouldWarnAboutField::Yes(is_positional)
     }
 
+    // # Panics
+    // All `dead_codes` must have the same lint level, otherwise we will intentionally ICE.
+    // This is because we emit a multi-spanned lint using the lint level of the `dead_codes`'s
+    // first local def id.
+    // Prefer calling `Self.warn_dead_code` or `Self.warn_dead_code_grouped_by_lint_level`
+    // since those methods group by lint level before calling this method.
     fn warn_multiple_dead_codes(
         &self,
         dead_codes: &[LocalDefId],
@@ -734,6 +740,15 @@ impl<'tcx> DeadVisitor<'tcx> {
             return;
         };
         let tcx = self.tcx;
+
+        let first_hir_id = tcx.hir().local_def_id_to_hir_id(first_id);
+        let first_lint_level = tcx.lint_level_at_node(lint::builtin::DEAD_CODE, first_hir_id).0;
+        assert!(dead_codes.iter().skip(1).all(|id| {
+            let hir_id = tcx.hir().local_def_id_to_hir_id(*id);
+            let level = tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir_id).0;
+            level == first_lint_level
+        }));
+
         let names: Vec<_> =
             dead_codes.iter().map(|&def_id| tcx.item_name(def_id.to_def_id())).collect();
         let spans: Vec<_> = dead_codes
@@ -814,18 +829,9 @@ impl<'tcx> DeadVisitor<'tcx> {
             }
         };
 
-        // FIXME: Remove this before landing the PR.
-        //  Just keeping it around so that I remember how to get the expectation id.
-        // for id in &dead_codes[1..] {
-        //     let hir = self.tcx.hir().local_def_id_to_hir_id(*id);
-        //     let lint_level = self.tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir).0;
-        //     if let Some(expectation_id) = lint_level.get_expectation_id() {
-        //         self.tcx.sess.diagnostic().insert_fulfilled_expectation(expectation_id);
-        //     }
-        // }
         self.tcx.emit_spanned_lint(
             lint,
-            tcx.hir().local_def_id_to_hir_id(first_id),
+            first_hir_id,
             MultiSpan::from_spans(spans),
             diag,
         );
@@ -903,14 +909,14 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalDefId) {
         if let hir::ItemKind::Impl(impl_item) = tcx.hir().item(item).kind {
             let mut dead_items = Vec::new();
             for item in impl_item.items {
-                let did = item.id.owner_id.def_id;
-                if !visitor.is_live_code(did) {
+                let def_id = item.id.owner_id.def_id;
+                if !visitor.is_live_code(def_id) {
                     let name = tcx.item_name(def_id.to_def_id());
-                    let hir = tcx.hir().local_def_id_to_hir_id(did);
+                    let hir = tcx.hir().local_def_id_to_hir_id(def_id);
                     let level = tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir).0;
 
                     dead_items.push(DeadVariant {
-                        def_id: did,
+                        def_id,
                         name,
                         level,
                     })