Skip to content

Commit 1a9dc2e

Browse files
committed
dead code lint to say "never constructed" for variants
As reported in rust-lang#19140, rust-lang#44083, and rust-lang#44565, some users were confused when the dead-code lint reported an enum variant to be "unused" when it was matched on (but not constructed). This wording change makes it clearer that the lint is in fact checking for construction. We continue to say "used" for all other items (it's tempting to say "called" for functions and methods, but this turns out not to be correct: functions can be passed as arguments and the dead-code lint isn't special-casing that or anything). Resolves rust-lang#19140.
1 parent d8d5b61 commit 1a9dc2e

File tree

5 files changed

+23
-18
lines changed

5 files changed

+23
-18
lines changed

src/librustc/middle/dead.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -531,13 +531,15 @@ impl<'a, 'tcx> DeadVisitor<'a, 'tcx> {
531531
id: ast::NodeId,
532532
span: syntax_pos::Span,
533533
name: ast::Name,
534-
node_type: &str) {
534+
node_type: &str,
535+
participle: &str) {
535536
if !name.as_str().starts_with("_") {
536537
self.tcx
537538
.lint_node(lint::builtin::DEAD_CODE,
538539
id,
539540
span,
540-
&format!("{} is never used: `{}`", node_type, name));
541+
&format!("{} is never {}: `{}`",
542+
node_type, participle, name));
541543
}
542544
}
543545
}
@@ -570,7 +572,8 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
570572
item.id,
571573
span,
572574
item.name,
573-
item.node.descriptive_variant()
575+
item.node.descriptive_variant(),
576+
"used",
574577
);
575578
} else {
576579
// Only continue if we didn't warn
@@ -583,23 +586,24 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
583586
g: &'tcx hir::Generics,
584587
id: ast::NodeId) {
585588
if self.should_warn_about_variant(&variant.node) {
586-
self.warn_dead_code(variant.node.data.id(), variant.span, variant.node.name, "variant");
589+
self.warn_dead_code(variant.node.data.id(), variant.span, variant.node.name,
590+
"variant", "constructed");
587591
} else {
588592
intravisit::walk_variant(self, variant, g, id);
589593
}
590594
}
591595

592596
fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem) {
593597
if self.should_warn_about_foreign_item(fi) {
594-
self.warn_dead_code(fi.id, fi.span, fi.name, fi.node.descriptive_variant());
598+
self.warn_dead_code(fi.id, fi.span, fi.name,
599+
fi.node.descriptive_variant(), "used");
595600
}
596601
intravisit::walk_foreign_item(self, fi);
597602
}
598603

599604
fn visit_struct_field(&mut self, field: &'tcx hir::StructField) {
600605
if self.should_warn_about_field(&field) {
601-
self.warn_dead_code(field.id, field.span,
602-
field.name, "field");
606+
self.warn_dead_code(field.id, field.span, field.name, "field", "used");
603607
}
604608
intravisit::walk_struct_field(self, field);
605609
}
@@ -611,14 +615,15 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
611615
self.warn_dead_code(impl_item.id,
612616
impl_item.span,
613617
impl_item.name,
614-
"associated const");
618+
"associated const",
619+
"used");
615620
}
616621
self.visit_nested_body(body_id)
617622
}
618623
hir::ImplItemKind::Method(_, body_id) => {
619624
if !self.symbol_is_live(impl_item.id, None) {
620625
let span = self.tcx.sess.codemap().def_span(impl_item.span);
621-
self.warn_dead_code(impl_item.id, span, impl_item.name, "method");
626+
self.warn_dead_code(impl_item.id, span, impl_item.name, "method", "used");
622627
}
623628
self.visit_nested_body(body_id)
624629
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub enum pub_enum3 {
7474
enum priv_enum { foo2, bar2 } //~ ERROR: enum is never used
7575
enum used_enum {
7676
foo3,
77-
bar3 //~ ERROR variant is never used
77+
bar3 //~ ERROR variant is never constructed
7878
}
7979

8080
fn f<T>() {}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ fn field_read(f: Foo) -> usize {
2222
}
2323

2424
enum XYZ {
25-
X, //~ ERROR variant is never used
26-
Y { //~ ERROR variant is never used
25+
X, //~ ERROR variant is never constructed
26+
Y { //~ ERROR variant is never constructed
2727
a: String,
2828
b: i32,
2929
c: i32,
@@ -43,13 +43,13 @@ enum ABC { //~ ERROR enum is never used
4343

4444
// ensure struct variants get warning for their fields
4545
enum IJK {
46-
I, //~ ERROR variant is never used
46+
I, //~ ERROR variant is never constructed
4747
J {
4848
a: String,
4949
b: i32, //~ ERROR field is never used
5050
c: i32, //~ ERROR field is never used
5151
},
52-
K //~ ERROR variant is never used
52+
K //~ ERROR variant is never constructed
5353

5454
}
5555

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@
1313

1414
enum Enum1 {
1515
Variant1(isize),
16-
Variant2 //~ ERROR: variant is never used
16+
Variant2 //~ ERROR: variant is never constructed
1717
}
1818

1919
enum Enum2 {
2020
Variant3(bool),
2121
#[allow(dead_code)]
2222
Variant4(isize),
23-
Variant5 { _x: isize }, //~ ERROR: variant is never used: `Variant5`
24-
Variant6(isize), //~ ERROR: variant is never used: `Variant6`
23+
Variant5 { _x: isize }, //~ ERROR: variant is never constructed: `Variant5`
24+
Variant6(isize), //~ ERROR: variant is never constructed: `Variant6`
2525
_Variant7,
2626
}
2727

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
#[derive(Clone)]
1414
enum Enum {
15-
Variant1, //~ ERROR: variant is never used
15+
Variant1, //~ ERROR: variant is never constructed
1616
Variant2,
1717
}
1818

0 commit comments

Comments
 (0)