Skip to content

Commit

Permalink
Rollup merge of rust-lang#124460 - long-long-float:show-notice-about-…
Browse files Browse the repository at this point in the history
…enum-with-debug, r=pnkfelix

Show notice about  "never used" of Debug for enum

Close rust-lang#123068

If an ADT implements `Debug` trait and it is not used, the compiler says a note that indicates intentionally ignored during dead code analysis as [this note](https://github.com/rust-lang/rust/blob/2207179a591f5f252885a94ab014dafeb6e8e9e8/tests/ui/lint/dead-code/unused-variant.stderr#L9).
However this node is not shown for variants that have fields in enum. This PR fixes to show the note.
  • Loading branch information
matthiaskrgr authored Jun 24, 2024
2 parents 06c072f + d630f5d commit 1368c5e
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
19 changes: 19 additions & 0 deletions compiler/rustc_passes/src/dead.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1010,6 +1010,22 @@ impl<'tcx> DeadVisitor<'tcx> {
parent_item: Option<LocalDefId>,
report_on: ReportOn,
) {
fn get_parent_if_enum_variant<'tcx>(
tcx: TyCtxt<'tcx>,
may_variant: LocalDefId,
) -> LocalDefId {
if let Node::Variant(_) = tcx.hir_node_by_def_id(may_variant)
&& let Some(enum_did) = tcx.opt_parent(may_variant.to_def_id())
&& let Some(enum_local_id) = enum_did.as_local()
&& let Node::Item(item) = tcx.hir_node_by_def_id(enum_local_id)
&& let ItemKind::Enum(_, _) = item.kind
{
enum_local_id
} else {
may_variant
}
}

let Some(&first_item) = dead_codes.first() else {
return;
};
Expand Down Expand Up @@ -1053,6 +1069,9 @@ impl<'tcx> DeadVisitor<'tcx> {
};

let encl_def_id = parent_item.unwrap_or(first_item.def_id);
// If parent of encl_def_id is an enum, use the parent ID intead.
let encl_def_id = get_parent_if_enum_variant(tcx, encl_def_id);

let ignored_derived_impls =
if let Some(ign_traits) = self.ignored_derived_traits.get(&encl_def_id) {
let trait_list = ign_traits
Expand Down
15 changes: 15 additions & 0 deletions tests/ui/lint/dead-code/unused-variant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,22 @@ enum Enum {
Variant2,
}

#[derive(Debug)]
enum TupleVariant {
Variant1(i32), //~ ERROR: variant `Variant1` is never constructed
Variant2,
}

#[derive(Debug)]
enum StructVariant {
Variant1 { id: i32 }, //~ ERROR: variant `Variant1` is never constructed
Variant2,
}

fn main() {
let e = Enum::Variant2;
e.clone();

let _ = TupleVariant::Variant2;
let _ = StructVariant::Variant2;
}
22 changes: 21 additions & 1 deletion tests/ui/lint/dead-code/unused-variant.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,25 @@ note: the lint level is defined here
LL | #![deny(dead_code)]
| ^^^^^^^^^

error: aborting due to 1 previous error
error: variant `Variant1` is never constructed
--> $DIR/unused-variant.rs:11:5
|
LL | enum TupleVariant {
| ------------ variant in this enum
LL | Variant1(i32),
| ^^^^^^^^
|
= note: `TupleVariant` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis

error: variant `Variant1` is never constructed
--> $DIR/unused-variant.rs:17:5
|
LL | enum StructVariant {
| ------------- variant in this enum
LL | Variant1 { id: i32 },
| ^^^^^^^^
|
= note: `StructVariant` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis

error: aborting due to 3 previous errors

0 comments on commit 1368c5e

Please sign in to comment.