Skip to content

Commit 36f211b

Browse files
committed
Auto merge of #29682 - Ryman:dead_spam, r=sanxiyn
This standardises the current behavior to match `enum` variants, hopefully leading to less warning spam for users! For example the code below will have 2 warnings (for `Foo` and `Bar`) rather than 7: ```rust enum Foo { A, B { a: String, b: isize }, C } struct Bar { a: i32, b: String, c: () } fn main() { println!("Hi") } ``` http://is.gd/zAztKW
2 parents 5b4986f + c0a3538 commit 36f211b

File tree

3 files changed

+44
-15
lines changed

3 files changed

+44
-15
lines changed

src/librustc/middle/dead.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -539,19 +539,18 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
539539
item.node.descriptive_variant()
540540
);
541541
} else {
542-
match item.node {
543-
hir::ItemEnum(ref enum_def, _) => {
544-
for variant in &enum_def.variants {
545-
if self.should_warn_about_variant(&variant.node) {
546-
self.warn_dead_code(variant.node.data.id(), variant.span,
547-
variant.node.name, "variant");
548-
}
549-
}
550-
},
551-
_ => ()
552-
}
542+
// Only continue if we didn't warn
543+
visit::walk_item(self, item);
544+
}
545+
}
546+
547+
fn visit_variant(&mut self, variant: &hir::Variant, g: &hir::Generics, id: ast::NodeId) {
548+
if self.should_warn_about_variant(&variant.node) {
549+
self.warn_dead_code(variant.node.data.id(), variant.span,
550+
variant.node.name, "variant");
551+
} else {
552+
visit::walk_variant(self, variant, g, id);
553553
}
554-
visit::walk_item(self, item);
555554
}
556555

557556
fn visit_foreign_item(&mut self, fi: &hir::ForeignItem) {

src/test/compile-fail/lint-dead-code-3.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl Foo {
3030
}
3131

3232
fn bar() { //~ ERROR: function is never used
33-
fn baz() {} //~ ERROR: function is never used
33+
fn baz() {}
3434

3535
Foo.foo();
3636
baz();

src/test/compile-fail/lint-dead-code-4.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,41 @@ enum XYZ {
2525
X, //~ ERROR variant is never used
2626
Y { //~ ERROR variant is never used
2727
a: String,
28-
b: i32, //~ ERROR: struct field is never used
29-
c: i32, //~ ERROR: struct field is never used
28+
b: i32,
29+
c: i32,
3030
},
3131
Z
3232
}
3333

34+
enum ABC { //~ ERROR enum is never used
35+
A,
36+
B {
37+
a: String,
38+
b: i32,
39+
c: i32,
40+
},
41+
C
42+
}
43+
44+
// ensure struct variants get warning for their fields
45+
enum IJK {
46+
I, //~ ERROR variant is never used
47+
J {
48+
a: String,
49+
b: i32, //~ ERROR struct field is never used
50+
c: i32, //~ ERROR struct field is never used
51+
},
52+
K //~ ERROR variant is never used
53+
54+
}
55+
56+
fn struct_variant_partial_use(b: IJK) -> String {
57+
match b {
58+
IJK::J { a, b: _, .. } => a,
59+
_ => "".to_string()
60+
}
61+
}
62+
3463
fn field_match_in_patterns(b: XYZ) -> String {
3564
match b {
3665
XYZ::Y { a, b: _, .. } => a,
@@ -58,6 +87,7 @@ fn field_match_in_let(f: Bar) -> bool {
5887
fn main() {
5988
field_read(Foo { x: 1, b: false });
6089
field_match_in_patterns(XYZ::Z);
90+
struct_variant_partial_use(IJK::J { a: "".into(), b: 1, c: -1 });
6191
field_match_in_let(Bar { x: 42, b: true, c: false, _guard: () });
6292
let _ = Baz { x: 0 };
6393
}

0 commit comments

Comments
 (0)