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:: { is_lint_allowed, std_or_core} ;
4+ use clippy_utils:: { is_lint_allowed, msrvs , std_or_core} ;
45use rustc_errors:: Applicability ;
56use rustc_hir:: { BorrowKind , Expr , ExprKind , Mutability , Ty , TyKind } ;
67use rustc_lint:: LateContext ;
@@ -13,16 +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) -> bool {
1719 if matches ! ( cast_to. kind, TyKind :: Ptr ( _) )
1820 && let ExprKind :: AddrOf ( BorrowKind :: Ref , mutability, e) = cast_expr. kind
19- && let Some ( std_or_core) = std_or_core ( cx)
2021 && !is_lint_allowed ( cx, BORROW_AS_PTR , expr. hir_id )
2122 {
22- let macro_name = match mutability {
23- Mutability :: Not => "addr_of" ,
24- Mutability :: Mut => "addr_of_mut" ,
25- } ;
2623 let mut app = Applicability :: MachineApplicable ;
2724 let snip = snippet_with_context ( cx, e. span , cast_expr. span . ctxt ( ) , ".." , & mut app) . 0 ;
2825 // Fix #9884
@@ -35,13 +32,30 @@ pub(super) fn check<'tcx>(
3532 return false ;
3633 }
3734
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 Some ( std_or_core) = std_or_core ( cx) else {
43+ return false ;
44+ } ;
45+ let macro_name = match mutability {
46+ Mutability :: Not => "addr_of" ,
47+ Mutability :: Mut => "addr_of_mut" ,
48+ } ;
49+ format ! ( "{std_or_core}::ptr::{macro_name}!({snip})" )
50+ } ;
51+
3852 span_lint_and_sugg (
3953 cx,
4054 BORROW_AS_PTR ,
4155 expr. span ,
4256 "borrow as raw pointer" ,
4357 "try" ,
44- format ! ( "{std_or_core}::ptr::{macro_name}!({snip})" ) ,
58+ suggestion ,
4559 Applicability :: MachineApplicable ,
4660 ) ;
4761 return true ;
0 commit comments