diff options
| author | bors <bors@rust-lang.org> | 2020-12-08 11:16:19 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-12-08 11:16:19 +0000 |
| commit | 5019791e2d4ac67b4c5c56853600a02f4b84e515 (patch) | |
| tree | 5821caf1950f46b3b31f44ddcf913fb2da3da634 | |
| parent | 4fd4a98d4788bc987d7f7add9df5f5ead6a1c15e (diff) | |
| parent | 37853f925f115eae8b2a3750d071de6af32309e7 (diff) | |
| download | rust-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.rs | 46 | ||||
| -rw-r--r-- | src/test/ui/lint/dead-code/type-in-foreign.rs | 19 |
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() {} |
