about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_errors/src/lib.rs4
-rw-r--r--compiler/rustc_passes/src/dead.rs7
-rw-r--r--tests/ui/lint/rfc-2383-lint-reason/expect_unused_inside_impl_block.rs25
3 files changed, 36 insertions, 0 deletions
diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs
index 3d1639db4af..0449d538709 100644
--- a/compiler/rustc_errors/src/lib.rs
+++ b/compiler/rustc_errors/src/lib.rs
@@ -1263,6 +1263,10 @@ impl Handler {
         std::mem::take(&mut self.inner.borrow_mut().fulfilled_expectations)
     }
 
+    pub fn insert_fulfilled_expectation(&self, expectation_id: LintExpectationId) {
+        self.inner.borrow_mut().fulfilled_expectations.insert(expectation_id);
+    }
+
     pub fn flush_delayed(&self) {
         let mut inner = self.inner.lock();
         let bugs = std::mem::replace(&mut inner.delayed_span_bugs, Vec::new());
diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs
index fbe6fc3bee4..39ecc9919d3 100644
--- a/compiler/rustc_passes/src/dead.rs
+++ b/compiler/rustc_passes/src/dead.rs
@@ -814,6 +814,13 @@ impl<'tcx> DeadVisitor<'tcx> {
             }
         };
 
+        for id in &dead_codes[1..] {
+            let hir = self.tcx.hir().local_def_id_to_hir_id(*id);
+            let lint_level = self.tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir).0;
+            if let Some(expectation_id) = lint_level.get_expectation_id() {
+                self.tcx.sess.diagnostic().insert_fulfilled_expectation(expectation_id);
+            }
+        }
         self.tcx.emit_spanned_lint(
             lint,
             tcx.hir().local_def_id_to_hir_id(first_id),
diff --git a/tests/ui/lint/rfc-2383-lint-reason/expect_unused_inside_impl_block.rs b/tests/ui/lint/rfc-2383-lint-reason/expect_unused_inside_impl_block.rs
new file mode 100644
index 00000000000..9779596d56e
--- /dev/null
+++ b/tests/ui/lint/rfc-2383-lint-reason/expect_unused_inside_impl_block.rs
@@ -0,0 +1,25 @@
+// check-pass
+
+#![feature(lint_reasons)]
+#![warn(unused)]
+
+struct OneUnused;
+struct TwoUnused;
+
+impl OneUnused {
+    #[expect(unused)]
+    fn unused() {}
+}
+
+impl TwoUnused {
+    #[expect(unused)]
+    fn unused1(){}
+
+    #[expect(unused)]
+    fn unused2(){}
+}
+
+fn main() {
+    let _ = OneUnused;
+    let _ = TwoUnused;
+}