about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-12-08 11:16:19 +0000
committerbors <bors@rust-lang.org>2020-12-08 11:16:19 +0000
commit5019791e2d4ac67b4c5c56853600a02f4b84e515 (patch)
tree5821caf1950f46b3b31f44ddcf913fb2da3da634
parent4fd4a98d4788bc987d7f7add9df5f5ead6a1c15e (diff)
parent37853f925f115eae8b2a3750d071de6af32309e7 (diff)
downloadrust-5019791e2d4ac67b4c5c56853600a02f4b84e515.tar.gz
rust-5019791e2d4ac67b4c5c56853600a02f4b84e515.zip
Auto merge of #79752 - cjgillot:dead-alien, r=lcnr
Visit ForeignItems when marking dead code

Follow-up to #79318

r? `@lcnr`
-rw-r--r--compiler/rustc_passes/src/dead.rs46
-rw-r--r--src/test/ui/lint/dead-code/type-in-foreign.rs19
2 files changed, 44 insertions, 21 deletions
diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs
index b87b13cff80..bbd6b9b505f 100644
--- a/compiler/rustc_passes/src/dead.rs
+++ b/compiler/rustc_passes/src/dead.rs
@@ -396,24 +396,6 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> {
                     }
                 }
             }
-            hir::ItemKind::Trait(.., trait_item_refs) => {
-                for trait_item_ref in trait_item_refs {
-                    let trait_item = self.krate.trait_item(trait_item_ref.id);
-                    match trait_item.kind {
-                        hir::TraitItemKind::Const(_, Some(_))
-                        | hir::TraitItemKind::Fn(_, hir::TraitFn::Provided(_)) => {
-                            if has_allow_dead_code_or_lang_attr(
-                                self.tcx,
-                                trait_item.hir_id,
-                                &trait_item.attrs,
-                            ) {
-                                self.worklist.push(trait_item.hir_id);
-                            }
-                        }
-                        _ => {}
-                    }
-                }
-            }
             hir::ItemKind::Impl { ref of_trait, items, .. } => {
                 if of_trait.is_some() {
                     self.worklist.push(item.hir_id);
@@ -440,15 +422,37 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> {
         }
     }
 
-    fn visit_trait_item(&mut self, _item: &hir::TraitItem<'_>) {
-        // ignore: we are handling this in `visit_item` above
+    fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) {
+        match trait_item.kind {
+            hir::TraitItemKind::Const(_, Some(_))
+            | hir::TraitItemKind::Fn(_, hir::TraitFn::Provided(_)) => {
+                if has_allow_dead_code_or_lang_attr(self.tcx, trait_item.hir_id, &trait_item.attrs)
+                {
+                    self.worklist.push(trait_item.hir_id);
+                }
+            }
+            _ => {}
+        }
     }
 
     fn visit_impl_item(&mut self, _item: &hir::ImplItem<'_>) {
         // ignore: we are handling this in `visit_item` above
     }
 
-    fn visit_foreign_item(&mut self, _item: &'v hir::ForeignItem<'v>) {}
+    fn visit_foreign_item(&mut self, foreign_item: &hir::ForeignItem<'_>) {
+        match foreign_item.kind {
+            hir::ForeignItemKind::Static(..) | hir::ForeignItemKind::Fn(..) => {
+                if has_allow_dead_code_or_lang_attr(
+                    self.tcx,
+                    foreign_item.hir_id,
+                    &foreign_item.attrs,
+                ) {
+                    self.worklist.push(foreign_item.hir_id);
+                }
+            }
+            _ => {}
+        }
+    }
 }
 
 fn create_and_seed_worklist<'tcx>(
diff --git a/src/test/ui/lint/dead-code/type-in-foreign.rs b/src/test/ui/lint/dead-code/type-in-foreign.rs
new file mode 100644
index 00000000000..b6c593f316f
--- /dev/null
+++ b/src/test/ui/lint/dead-code/type-in-foreign.rs
@@ -0,0 +1,19 @@
+// Verify that we do not warn on types that are used by foreign functions.
+// check-pass
+#![deny(dead_code)]
+
+#[repr(C)]
+struct Type(u8);
+
+#[repr(C)]
+struct Param(u8);
+
+extern "C" {
+    #[allow(dead_code)]
+    fn hey(t: Param);
+
+    #[allow(dead_code)]
+    static much: Type;
+}
+
+fn main() {}