Skip to content

Commit 44cfa78

Browse files
authored
Rollup merge of rust-lang#63317 - estebank:dead-code, r=matthewjasper
Do not complain about unused code when used in `impl` `Self` type Fix rust-lang#18290.
2 parents 9b91b9c + 7def99a commit 44cfa78

12 files changed

+172
-20
lines changed

src/librustc/middle/dead.rs

+20-6
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ fn should_explore(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> bool {
3030
Some(Node::Item(..)) |
3131
Some(Node::ImplItem(..)) |
3232
Some(Node::ForeignItem(..)) |
33-
Some(Node::TraitItem(..)) =>
34-
true,
35-
_ =>
36-
false
33+
Some(Node::TraitItem(..)) |
34+
Some(Node::Variant(..)) |
35+
Some(Node::AnonConst(..)) |
36+
Some(Node::Pat(..)) => true,
37+
_ => false
3738
}
3839
}
3940

@@ -75,7 +76,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
7576
self.check_def_id(res.def_id());
7677
}
7778
_ if self.in_pat => {},
78-
Res::PrimTy(..) | Res::SelfTy(..) | Res::SelfCtor(..) |
79+
Res::PrimTy(..) | Res::SelfCtor(..) |
7980
Res::Local(..) => {}
8081
Res::Def(DefKind::Ctor(CtorOf::Variant, ..), ctor_def_id) => {
8182
let variant_id = self.tcx.parent(ctor_def_id).unwrap();
@@ -92,6 +93,14 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
9293
self.check_def_id(variant_id);
9394
}
9495
}
96+
Res::SelfTy(t, i) => {
97+
if let Some(t) = t {
98+
self.check_def_id(t);
99+
}
100+
if let Some(i) = i {
101+
self.check_def_id(i);
102+
}
103+
}
95104
Res::ToolMod | Res::NonMacroAttr(..) | Res::Err => {}
96105
_ => {
97106
self.check_def_id(res.def_id());
@@ -271,7 +280,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkSymbolVisitor<'a, 'tcx> {
271280
let res = self.tables.qpath_res(path, pat.hir_id);
272281
self.handle_field_pattern_match(pat, res, fields);
273282
}
274-
PatKind::Path(ref qpath @ hir::QPath::TypeRelative(..)) => {
283+
PatKind::Path(ref qpath) => {
275284
let res = self.tables.qpath_res(qpath, pat.hir_id);
276285
self.handle_res(res);
277286
}
@@ -298,6 +307,11 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkSymbolVisitor<'a, 'tcx> {
298307
}
299308
intravisit::walk_ty(self, ty);
300309
}
310+
311+
fn visit_anon_const(&mut self, c: &'tcx hir::AnonConst) {
312+
self.live_symbols.insert(c.hir_id);
313+
intravisit::walk_anon_const(self, c);
314+
}
301315
}
302316

303317
fn has_allow_dead_code_or_lang_attr(

src/test/ui/derive-uninhabited-enum-38885.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
// when deriving Debug on an empty enum
66

77
#[derive(Debug)]
8-
enum Void {} //~ WARN never used
8+
enum Void {}
99

1010
#[derive(Debug)]
11-
enum Foo { //~ WARN never used
11+
enum Foo {
1212
Bar(u8),
13-
Void(Void),
13+
Void(Void), //~ WARN never used
1414
}
1515

16-
fn main() {}
16+
fn main() {
17+
let x = Foo::Bar(42);
18+
println!("{:?}", x);
19+
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
warning: enum is never used: `Void`
2-
--> $DIR/derive-uninhabited-enum-38885.rs:8:1
1+
warning: variant is never constructed: `Void`
2+
--> $DIR/derive-uninhabited-enum-38885.rs:13:5
33
|
4-
LL | enum Void {}
5-
| ^^^^^^^^^
4+
LL | Void(Void),
5+
| ^^^^^^^^^^
66
|
77
= note: `-W dead-code` implied by `-W unused`
88

9-
warning: enum is never used: `Foo`
10-
--> $DIR/derive-uninhabited-enum-38885.rs:11:1
11-
|
12-
LL | enum Foo {
13-
| ^^^^^^^^
14-
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// check-pass
2+
3+
#![deny(dead_code)]
4+
5+
const TLC: usize = 4;
6+
7+
trait Tr { fn doit(&self); }
8+
9+
impl Tr for [usize; TLC] {
10+
fn doit(&self) {
11+
println!("called 4");
12+
}
13+
}
14+
15+
struct X;
16+
struct Y;
17+
struct Z;
18+
19+
trait Foo<T> {
20+
type Ty;
21+
fn foo() -> Self::Ty;
22+
}
23+
24+
impl Foo<Y> for X {
25+
type Ty = Z;
26+
fn foo() -> Self::Ty {
27+
unimplemented!()
28+
}
29+
}
30+
31+
fn main() {
32+
let s = [0,1,2,3];
33+
s.doit();
34+
X::foo();
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// build-pass
2+
#![deny(unused)]
3+
4+
pub enum E {}
5+
6+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#![deny(unused)]
2+
3+
enum E {} //~ ERROR enum is never used
4+
5+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error: enum is never used: `E`
2+
--> $DIR/lint-dead-code-empty-unused-enum.rs:3:1
3+
|
4+
LL | enum E {}
5+
| ^^^^^^
6+
|
7+
note: lint level defined here
8+
--> $DIR/lint-dead-code-empty-unused-enum.rs:1:9
9+
|
10+
LL | #![deny(unused)]
11+
| ^^^^^^
12+
= note: `#[deny(dead_code)]` implied by `#[deny(unused)]`
13+
14+
error: aborting due to previous error
15+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#![deny(unused)]
2+
3+
struct F; //~ ERROR struct is never constructed
4+
struct B; //~ ERROR struct is never constructed
5+
6+
enum E { //~ ERROR enum is never used
7+
Foo(F),
8+
Bar(B),
9+
}
10+
11+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
error: struct is never constructed: `F`
2+
--> $DIR/lint-dead-code-unused-enum.rs:3:1
3+
|
4+
LL | struct F;
5+
| ^^^^^^^^^
6+
|
7+
note: lint level defined here
8+
--> $DIR/lint-dead-code-unused-enum.rs:1:9
9+
|
10+
LL | #![deny(unused)]
11+
| ^^^^^^
12+
= note: `#[deny(dead_code)]` implied by `#[deny(unused)]`
13+
14+
error: struct is never constructed: `B`
15+
--> $DIR/lint-dead-code-unused-enum.rs:4:1
16+
|
17+
LL | struct B;
18+
| ^^^^^^^^^
19+
20+
error: enum is never used: `E`
21+
--> $DIR/lint-dead-code-unused-enum.rs:6:1
22+
|
23+
LL | enum E {
24+
| ^^^^^^
25+
26+
error: aborting due to 3 previous errors
27+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// build-pass
2+
#![deny(unused)]
3+
4+
pub struct F;
5+
pub struct B;
6+
7+
pub enum E {
8+
Foo(F),
9+
Bar(B),
10+
}
11+
12+
fn main() {
13+
let _ = E::Foo(F);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#![deny(unused)]
2+
3+
struct F;
4+
struct B;
5+
6+
enum E {
7+
Foo(F),
8+
Bar(B), //~ ERROR variant is never constructed
9+
}
10+
11+
fn main() {
12+
let _ = E::Foo(F);
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error: variant is never constructed: `Bar`
2+
--> $DIR/lint-dead-code-unused-variant.rs:8:5
3+
|
4+
LL | Bar(B),
5+
| ^^^^^^
6+
|
7+
note: lint level defined here
8+
--> $DIR/lint-dead-code-unused-variant.rs:1:9
9+
|
10+
LL | #![deny(unused)]
11+
| ^^^^^^
12+
= note: `#[deny(dead_code)]` implied by `#[deny(unused)]`
13+
14+
error: aborting due to previous error
15+

0 commit comments

Comments
 (0)