summaryrefslogtreecommitdiff
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
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() {}