Show notice about "never used" for enum · rust-lang/rust@d630f5d (original) (raw)
File tree
3 files changed
lines changed
- compiler/rustc_passes/src
3 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1011,6 +1011,22 @@ impl<'tcx> DeadVisitor<'tcx> { | ||
1011 | 1011 | parent_item: Option<LocalDefId>, |
1012 | 1012 | report_on: ReportOn, |
1013 | 1013 | ) { |
1014 | +fn get_parent_if_enum_variant<'tcx>( | |
1015 | +tcx: TyCtxt<'tcx>, | |
1016 | +may_variant: LocalDefId, | |
1017 | +) -> LocalDefId { | |
1018 | +if let Node::Variant(_) = tcx.hir_node_by_def_id(may_variant) | |
1019 | + && let Some(enum_did) = tcx.opt_parent(may_variant.to_def_id()) | |
1020 | + && let Some(enum_local_id) = enum_did.as_local() | |
1021 | + && let Node::Item(item) = tcx.hir_node_by_def_id(enum_local_id) | |
1022 | + && let ItemKind::Enum(_, _) = item.kind | |
1023 | +{ | |
1024 | + enum_local_id | |
1025 | +} else { | |
1026 | + may_variant | |
1027 | +} | |
1028 | +} | |
1029 | + | |
1014 | 1030 | let Some(&first_item) = dead_codes.first() else { |
1015 | 1031 | return; |
1016 | 1032 | }; |
@@ -1054,6 +1070,9 @@ impl<'tcx> DeadVisitor<'tcx> { | ||
1054 | 1070 | }; |
1055 | 1071 | |
1056 | 1072 | let encl_def_id = parent_item.unwrap_or(first_item.def_id); |
1073 | +// If parent of encl_def_id is an enum, use the parent ID intead. | |
1074 | +let encl_def_id = get_parent_if_enum_variant(tcx, encl_def_id); | |
1075 | + | |
1057 | 1076 | let ignored_derived_impls = |
1058 | 1077 | if let Some(ign_traits) = self.ignored_derived_traits.get(&encl_def_id) { |
1059 | 1078 | let trait_list = ign_traits |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -6,7 +6,22 @@ enum Enum { | ||
6 | 6 | Variant2, |
7 | 7 | } |
8 | 8 | |
9 | +#[derive(Debug)] | |
10 | +enum TupleVariant { | |
11 | +Variant1(i32), //~ ERROR: variant `Variant1` is never constructed | |
12 | +Variant2, | |
13 | +} | |
14 | + | |
15 | +#[derive(Debug)] | |
16 | +enum StructVariant { | |
17 | +Variant1 { id: i32 }, //~ ERROR: variant `Variant1` is never constructed | |
18 | +Variant2, | |
19 | +} | |
20 | + | |
9 | 21 | fn main() { |
10 | 22 | let e = Enum::Variant2; |
11 | 23 | e.clone(); |
24 | + | |
25 | +let _ = TupleVariant::Variant2; | |
26 | +let _ = StructVariant::Variant2; | |
12 | 27 | } |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -13,5 +13,25 @@ note: the lint level is defined here | ||
13 | 13 | LL | #![deny(dead_code)] |
14 | 14 | | ^^^^^^^^^ |
15 | 15 | |
16 | -error: aborting due to 1 previous error | |
16 | +error: variant `Variant1` is never constructed | |
17 | + --> $DIR/unused-variant.rs:11:5 | |
18 | + | | |
19 | +LL | enum TupleVariant { | |
20 | + | ------------ variant in this enum | |
21 | +LL | Variant1(i32), | |
22 | + | ^^^^^^^^ | |
23 | + | | |
24 | + = note: `TupleVariant` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis | |
25 | + | |
26 | +error: variant `Variant1` is never constructed | |
27 | + --> $DIR/unused-variant.rs:17:5 | |
28 | + | | |
29 | +LL | enum StructVariant { | |
30 | + | ------------- variant in this enum | |
31 | +LL | Variant1 { id: i32 }, | |
32 | + | ^^^^^^^^ | |
33 | + | | |
34 | + = note: `StructVariant` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis | |
35 | + | |
36 | +error: aborting due to 3 previous errors | |
17 | 37 |