diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs index b1db66fa52d4b..3d23383db55d9 100644 --- a/compiler/rustc_passes/src/dead.rs +++ b/compiler/rustc_passes/src/dead.rs @@ -239,6 +239,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { let index = self.typeck_results().field_index(pat.hir_id); self.insert_def_id(variant.fields[index].did); } + self.check_def_id(variant.def_id); } fn handle_tuple_field_pattern_match( @@ -265,6 +266,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { } self.insert_def_id(variant.fields[FieldIdx::from_usize(idx)].did); } + self.check_def_id(variant.def_id); } fn handle_offset_of(&mut self, expr: &'tcx hir::Expr<'tcx>) { diff --git a/tests/ui/lint/dead-code/lint-dead-code-4.rs b/tests/ui/lint/dead-code/lint-dead-code-4.rs index 0fc6c6156fd93..8d62a9ae34f55 100644 --- a/tests/ui/lint/dead-code/lint-dead-code-4.rs +++ b/tests/ui/lint/dead-code/lint-dead-code-4.rs @@ -12,10 +12,10 @@ fn field_read(f: Foo) -> usize { } enum XYZ { - X, //~ ERROR variants `X` and `Y` are never constructed + X, //~ ERROR variant `X` is never constructed Y { a: String, - b: i32, + b: i32, //~ ERROR fields `b` and `c` are never read c: i32, }, Z diff --git a/tests/ui/lint/dead-code/lint-dead-code-4.stderr b/tests/ui/lint/dead-code/lint-dead-code-4.stderr index 668c1dacf95a7..7b5e9cccd9e3a 100644 --- a/tests/ui/lint/dead-code/lint-dead-code-4.stderr +++ b/tests/ui/lint/dead-code/lint-dead-code-4.stderr @@ -13,15 +13,24 @@ note: the lint level is defined here LL | #![deny(dead_code)] | ^^^^^^^^^ -error: variants `X` and `Y` are never constructed +error: fields `b` and `c` are never read + --> $DIR/lint-dead-code-4.rs:18:9 + | +LL | Y { + | - fields in this variant +LL | a: String, +LL | b: i32, + | ^ +LL | c: i32, + | ^ + +error: variant `X` is never constructed --> $DIR/lint-dead-code-4.rs:15:5 | LL | enum XYZ { - | --- variants in this enum + | --- variant in this enum LL | X, | ^ -LL | Y { - | ^ error: enum `ABC` is never used --> $DIR/lint-dead-code-4.rs:24:6 @@ -62,5 +71,5 @@ LL | b: bool, LL | c: bool, | ^ -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors diff --git a/tests/ui/lint/dead-code/only-used-for-destructuring-struct.rs b/tests/ui/lint/dead-code/only-used-for-destructuring-struct.rs new file mode 100644 index 0000000000000..58a0fd191b3f1 --- /dev/null +++ b/tests/ui/lint/dead-code/only-used-for-destructuring-struct.rs @@ -0,0 +1,17 @@ +//@ check-pass + +// Make sure we don't have any false positives here. + +#![deny(dead_code)] + +struct Foo { + bar: usize, +} + +fn get_thing() -> T { + todo!() +} + +pub fn main() { + let Foo { bar: _x } = get_thing(); +} diff --git a/tests/ui/lint/dead-code/only-used-for-destructuring-tuple-struct.rs b/tests/ui/lint/dead-code/only-used-for-destructuring-tuple-struct.rs new file mode 100644 index 0000000000000..b568486e51dbe --- /dev/null +++ b/tests/ui/lint/dead-code/only-used-for-destructuring-tuple-struct.rs @@ -0,0 +1,13 @@ +//@ check-pass + +// Make sure we don't have any false positives here. + +#![deny(dead_code)] + +struct Foo(usize); + +fn get_thing() -> T { todo!() } + +pub fn main() { + let Foo(_x) = get_thing(); +}