11use clippy_utils:: diagnostics:: span_lint_and_sugg;
2+ use clippy_utils:: msrvs:: Msrv ;
23use clippy_utils:: source:: snippet_with_context;
3- use clippy_utils:: std_or_core;
4+ use clippy_utils:: { msrvs , std_or_core} ;
45use rustc_errors:: Applicability ;
56use rustc_hir:: { BorrowKind , Expr , ExprKind , Mutability , Ty , TyKind } ;
67use rustc_lint:: LateContext ;
@@ -13,15 +14,12 @@ pub(super) fn check<'tcx>(
1314 expr : & ' tcx Expr < ' _ > ,
1415 cast_expr : & ' tcx Expr < ' _ > ,
1516 cast_to : & ' tcx Ty < ' _ > ,
17+ msrv : & Msrv ,
1618) {
1719 if matches ! ( cast_to. kind, TyKind :: Ptr ( _) )
1820 && let ExprKind :: AddrOf ( BorrowKind :: Ref , mutability, e) = cast_expr. kind
1921 && let Some ( std_or_core) = std_or_core ( cx)
2022 {
21- let macro_name = match mutability {
22- Mutability :: Not => "addr_of" ,
23- Mutability :: Mut => "addr_of_mut" ,
24- } ;
2523 let mut app = Applicability :: MachineApplicable ;
2624 let snip = snippet_with_context ( cx, e. span , cast_expr. span . ctxt ( ) , ".." , & mut app) . 0 ;
2725 // Fix #9884
@@ -34,13 +32,27 @@ pub(super) fn check<'tcx>(
3432 return ;
3533 }
3634
35+ let suggestion = if msrv. meets ( msrvs:: RAW_REF_OP ) {
36+ let operator_kind = match mutability {
37+ Mutability :: Not => "const" ,
38+ Mutability :: Mut => "mut" ,
39+ } ;
40+ format ! ( "&raw {operator_kind} {snip}" )
41+ } else {
42+ let macro_name = match mutability {
43+ Mutability :: Not => "addr_of" ,
44+ Mutability :: Mut => "addr_of_mut" ,
45+ } ;
46+ format ! ( "{std_or_core}::ptr::{macro_name}!({snip})" )
47+ } ;
48+
3749 span_lint_and_sugg (
3850 cx,
3951 BORROW_AS_PTR ,
4052 expr. span ,
4153 "borrow as raw pointer" ,
4254 "try" ,
43- format ! ( "{std_or_core}::ptr::{macro_name}!({snip})" ) ,
55+ suggestion ,
4456 Applicability :: MachineApplicable ,
4557 ) ;
4658 }
0 commit comments