]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/casts/borrow_as_ptr.rs
Rollup merge of #102227 - devnexen:solarish_get_path, r=m-ou-se
[rust.git] / src / tools / clippy / clippy_lints / src / casts / borrow_as_ptr.rs
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;
7
8 use super::BORROW_AS_PTR;
9
10 pub(super) fn check<'tcx>(
11     cx: &LateContext<'tcx>,
12     expr: &'tcx Expr<'_>,
13     cast_expr: &'tcx Expr<'_>,
14     cast_to: &'tcx Ty<'_>,
15 ) {
16     if matches!(cast_to.kind, TyKind::Ptr(_))
17         && let ExprKind::AddrOf(BorrowKind::Ref, mutability, e) = cast_expr.kind
18     {
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",
23         };
24         let mut app = Applicability::MachineApplicable;
25         let snip = snippet_with_context(cx, e.span, cast_expr.span.ctxt(), "..", &mut app).0;
26
27         span_lint_and_sugg(
28             cx,
29             BORROW_AS_PTR,
30             expr.span,
31             "borrow as raw pointer",
32             "try",
33             format!("{core_or_std}::ptr::{macro_name}!({snip})"),
34             Applicability::MachineApplicable,
35         );
36     }
37 }