Auto merge of #79752 - cjgillot:dead-alien, r=lcnr

Visit ForeignItems when marking dead code

Follow-up to #79318

r? `@lcnr`
This commit is contained in:
bors 2020-12-08 11:16:19 +00:00
commit 5019791e2d
2 changed files with 44 additions and 21 deletions

View file

@ -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>(

View file

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