dead_code: look at trait impls even if they don't contain items

This commit is contained in:
Bastian Kauschke 2020-09-22 21:25:32 +02:00
parent e0bc267512
commit 438d229b25
3 changed files with 44 additions and 1 deletions

View File

@ -369,7 +369,7 @@ fn has_allow_dead_code_or_lang_attr(
// - This is because lang items are always callable from elsewhere.
// or
// 2) We are not sure to be live or not
// * Implementation of a trait method
// * Implementations of traits and trait methods
struct LifeSeeder<'k, 'tcx> {
worklist: Vec<hir::HirId>,
krate: &'k hir::Crate<'k>,
@ -415,6 +415,9 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> {
}
}
hir::ItemKind::Impl { ref of_trait, items, .. } => {
if of_trait.is_some() {
self.worklist.push(item.hir_id);
}
for impl_item_ref in items {
let impl_item = self.krate.impl_item(impl_item_ref.id);
if of_trait.is_some()

View File

@ -0,0 +1,21 @@
// check-pass
#![feature(const_generics)]
#![allow(incomplete_features)]
#![deny(dead_code)]
// We previously incorrectly linted `L` as unused here.
const L: usize = 3;
fn main() {
let p = Printer {};
p.print();
}
trait Print<const N: usize> {
fn print(&self) -> usize {
3
}
}
struct Printer {}
impl Print<L> for Printer {}

View File

@ -0,0 +1,19 @@
// check-pass
#![deny(dead_code)]
enum Foo {
Bar,
}
fn main() {
let p = [0; 0];
p.bar();
}
trait Bar {
fn bar(&self) -> usize {
3
}
}
impl Bar for [u32; Foo::Bar as usize] {}