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 @@ fn visit_item(&mut self, item: &hir::Item<'_>) { } } } - 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 @@ fn visit_item(&mut self, item: &hir::Item<'_>) { } } - 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() {}