about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2025-03-10 18:30:12 +0100
committerSamuel Tardieu <sam@rfc1149.net>2025-05-16 17:20:21 +0200
commit2cfbb05d6a9293aa2ef93bca98c2ec3d373cea6d (patch)
treeed7fa7b2d261b3f2a10af7f3ba2bc6363c7ed1de
parent3688b33cb34f7fbee69a285cf4d76f45a227ef40 (diff)
downloadrust-2cfbb05d6a9293aa2ef93bca98c2ec3d373cea6d.tar.gz
rust-2cfbb05d6a9293aa2ef93bca98c2ec3d373cea6d.zip
Convert `deref_addrof` lint to late lint
This is necessary in order to use type analysis in later commits.
-rw-r--r--clippy_lints/src/lib.rs2
-rw-r--r--clippy_lints/src/reference.rs21
2 files changed, 8 insertions, 15 deletions
diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs
index 006145cc623..ceb423b02ee 100644
--- a/clippy_lints/src/lib.rs
+++ b/clippy_lints/src/lib.rs
@@ -717,7 +717,7 @@ pub fn register_lints(store: &mut rustc_lint::LintStore, conf: &'static Conf) {
     store.register_late_pass(move |_| Box::new(trait_bounds::TraitBounds::new(conf)));
     store.register_late_pass(|_| Box::new(comparison_chain::ComparisonChain));
     store.register_late_pass(move |tcx| Box::new(mut_key::MutableKeyType::new(tcx, conf)));
-    store.register_early_pass(|| Box::new(reference::DerefAddrOf));
+    store.register_late_pass(|_| Box::new(reference::DerefAddrOf));
     store.register_early_pass(|| Box::new(double_parens::DoubleParens));
     let format_args = format_args_storage.clone();
     store.register_late_pass(move |_| Box::new(format_impl::FormatImpl::new(format_args.clone())));
diff --git a/clippy_lints/src/reference.rs b/clippy_lints/src/reference.rs
index 4bff37216ed..cb414d79119 100644
--- a/clippy_lints/src/reference.rs
+++ b/clippy_lints/src/reference.rs
@@ -1,8 +1,8 @@
 use clippy_utils::diagnostics::span_lint_and_sugg;
 use clippy_utils::source::{SpanRangeExt, snippet_with_applicability};
-use rustc_ast::ast::{Expr, ExprKind, Mutability, UnOp};
 use rustc_errors::Applicability;
-use rustc_lint::{EarlyContext, EarlyLintPass};
+use rustc_hir::{Expr, ExprKind, Mutability, UnOp};
+use rustc_lint::{LateContext, LateLintPass};
 use rustc_session::declare_lint_pass;
 use rustc_span::{BytePos, Span};
 
@@ -37,17 +37,10 @@ declare_clippy_lint! {
 
 declare_lint_pass!(DerefAddrOf => [DEREF_ADDROF]);
 
-fn without_parens(mut e: &Expr) -> &Expr {
-    while let ExprKind::Paren(ref child_e) = e.kind {
-        e = child_e;
-    }
-    e
-}
-
-impl EarlyLintPass for DerefAddrOf {
-    fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) {
-        if let ExprKind::Unary(UnOp::Deref, ref deref_target) = e.kind
-            && let ExprKind::AddrOf(_, ref mutability, ref addrof_target) = without_parens(deref_target).kind
+impl LateLintPass<'_> for DerefAddrOf {
+    fn check_expr(&mut self, cx: &LateContext<'_>, e: &Expr<'_>) {
+        if let ExprKind::Unary(UnOp::Deref, deref_target) = e.kind
+            && let ExprKind::AddrOf(_, mutability, addrof_target) = deref_target.kind
             // NOTE(tesuji): `*&` forces rustc to const-promote the array to `.rodata` section.
             // See #12854 for details.
             && !matches!(addrof_target.kind, ExprKind::Array(_))
@@ -79,7 +72,7 @@ impl EarlyLintPass for DerefAddrOf {
                         })
                     };
 
-                    if *mutability == Mutability::Mut {
+                    if mutability == Mutability::Mut {
                         generate_snippet("mut")
                     } else {
                         generate_snippet("&")