1 use clippy_utils::diagnostics::span_lint_and_sugg;
2 use clippy_utils::is_no_std_crate;
3 use clippy_utils::source::snippet_with_context;
4 use rustc_errors::Applicability;
5 use rustc_hir::{BorrowKind, Expr, ExprKind, Mutability, Ty, TyKind};
6 use rustc_lint::LateContext;
8 use super::BORROW_AS_PTR;
10 pub(super) fn check<'tcx>(
11 cx: &LateContext<'tcx>,
13 cast_expr: &'tcx Expr<'_>,
14 cast_to: &'tcx Ty<'_>,
16 if matches!(cast_to.kind, TyKind::Ptr(_))
17 && let ExprKind::AddrOf(BorrowKind::Ref, mutability, e) = cast_expr.kind
19 let core_or_std = if is_no_std_crate(cx) { "core" } else { "std" };
20 let macro_name = match mutability {
21 Mutability::Not => "addr_of",
22 Mutability::Mut => "addr_of_mut",
24 let mut app = Applicability::MachineApplicable;
25 let snip = snippet_with_context(cx, e.span, cast_expr.span.ctxt(), "..", &mut app).0;
31 "borrow as raw pointer",
33 format!("{}::ptr::{}!({})", core_or_std, macro_name, snip),
34 Applicability::MachineApplicable,