From 6a065f78c43c8ee8f0a9a0607eb33f8e23ed69f9 Mon Sep 17 00:00:00 2001
From: Kitsu <mail@kitsu.me>
Date: Fri, 21 Oct 2022 12:50:28 +0300
Subject: [PATCH 1/2] Fix unreachable_pub suggestion for enum with fields

---
 compiler/rustc_lint/src/builtin.rs   |  8 ++++++--
 src/test/ui/lint/issue-103317.rs     | 13 +++++++++++++
 src/test/ui/lint/issue-103317.stderr | 17 +++++++++++++++++
 3 files changed, 36 insertions(+), 2 deletions(-)
 create mode 100644 src/test/ui/lint/issue-103317.rs
 create mode 100644 src/test/ui/lint/issue-103317.stderr

diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs
index 886e25f2d788b..dfd664521899a 100644
--- a/compiler/rustc_lint/src/builtin.rs
+++ b/compiler/rustc_lint/src/builtin.rs
@@ -40,7 +40,7 @@ use rustc_feature::{deprecated_attributes, AttributeGate, BuiltinAttribute, Gate
 use rustc_hir as hir;
 use rustc_hir::def::{DefKind, Res};
 use rustc_hir::def_id::{DefId, LocalDefId, LocalDefIdSet, CRATE_DEF_ID};
-use rustc_hir::{ForeignItemKind, GenericParamKind, HirId, PatKind, PredicateOrigin};
+use rustc_hir::{ForeignItemKind, GenericParamKind, HirId, Node, PatKind, PredicateOrigin};
 use rustc_index::vec::Idx;
 use rustc_middle::lint::in_external_macro;
 use rustc_middle::ty::layout::{LayoutError, LayoutOf};
@@ -1430,7 +1430,11 @@ impl<'tcx> LateLintPass<'tcx> for UnreachablePub {
     }
 
     fn check_field_def(&mut self, cx: &LateContext<'_>, field: &hir::FieldDef<'_>) {
-        let def_id = cx.tcx.hir().local_def_id(field.hir_id);
+        let map = cx.tcx.hir();
+        let def_id = map.local_def_id(field.hir_id);
+        if matches!(map.get(map.get_parent_node(field.hir_id)), Node::Variant(_)) {
+            return;
+        }
         self.perform_lint(cx, "field", def_id, field.vis_span, false);
     }
 
diff --git a/src/test/ui/lint/issue-103317.rs b/src/test/ui/lint/issue-103317.rs
new file mode 100644
index 0000000000000..b39b441a0cf35
--- /dev/null
+++ b/src/test/ui/lint/issue-103317.rs
@@ -0,0 +1,13 @@
+// check-pass
+
+#[warn(unreachable_pub)]
+#[allow(unused)]
+mod inner {
+    pub enum T {
+        //~^ WARN unreachable `pub` item
+        A(u8),
+        X { a: f32, b: () },
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/lint/issue-103317.stderr b/src/test/ui/lint/issue-103317.stderr
new file mode 100644
index 0000000000000..9fdd6a570e6ff
--- /dev/null
+++ b/src/test/ui/lint/issue-103317.stderr
@@ -0,0 +1,17 @@
+warning: unreachable `pub` item
+  --> $DIR/issue-103317.rs:6:5
+   |
+LL |     pub enum T {
+   |     ---^^^^^^^
+   |     |
+   |     help: consider restricting its visibility: `pub(crate)`
+   |
+   = help: or consider exporting it for use by other crates
+note: the lint level is defined here
+  --> $DIR/issue-103317.rs:3:8
+   |
+LL | #[warn(unreachable_pub)]
+   |        ^^^^^^^^^^^^^^^
+
+warning: 1 warning emitted
+

From 137271ad73585428bf0a69271a888f81c254c8c4 Mon Sep 17 00:00:00 2001
From: Kitsu <mail@kitsu.me>
Date: Sat, 29 Oct 2022 18:44:24 +0300
Subject: [PATCH 2/2] Run rustfix test for 103317 case

---
 src/test/ui/lint/issue-103317.fixed  | 14 ++++++++++++++
 src/test/ui/lint/issue-103317.rs     |  3 ++-
 src/test/ui/lint/issue-103317.stderr |  4 ++--
 3 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 src/test/ui/lint/issue-103317.fixed

diff --git a/src/test/ui/lint/issue-103317.fixed b/src/test/ui/lint/issue-103317.fixed
new file mode 100644
index 0000000000000..5a987423e5b95
--- /dev/null
+++ b/src/test/ui/lint/issue-103317.fixed
@@ -0,0 +1,14 @@
+// check-pass
+// run-rustfix
+
+#[warn(unreachable_pub)]
+mod inner {
+    #[allow(unused)]
+    pub(crate) enum T {
+        //~^ WARN unreachable `pub` item
+        A(u8),
+        X { a: f32, b: () },
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/lint/issue-103317.rs b/src/test/ui/lint/issue-103317.rs
index b39b441a0cf35..c2ba939e13c6f 100644
--- a/src/test/ui/lint/issue-103317.rs
+++ b/src/test/ui/lint/issue-103317.rs
@@ -1,8 +1,9 @@
 // check-pass
+// run-rustfix
 
 #[warn(unreachable_pub)]
-#[allow(unused)]
 mod inner {
+    #[allow(unused)]
     pub enum T {
         //~^ WARN unreachable `pub` item
         A(u8),
diff --git a/src/test/ui/lint/issue-103317.stderr b/src/test/ui/lint/issue-103317.stderr
index 9fdd6a570e6ff..9c982ddc3464a 100644
--- a/src/test/ui/lint/issue-103317.stderr
+++ b/src/test/ui/lint/issue-103317.stderr
@@ -1,5 +1,5 @@
 warning: unreachable `pub` item
-  --> $DIR/issue-103317.rs:6:5
+  --> $DIR/issue-103317.rs:7:5
    |
 LL |     pub enum T {
    |     ---^^^^^^^
@@ -8,7 +8,7 @@ LL |     pub enum T {
    |
    = help: or consider exporting it for use by other crates
 note: the lint level is defined here
-  --> $DIR/issue-103317.rs:3:8
+  --> $DIR/issue-103317.rs:4:8
    |
 LL | #[warn(unreachable_pub)]
    |        ^^^^^^^^^^^^^^^