1
1
use clippy_utils:: diagnostics:: span_lint_and_sugg;
2
+ use clippy_utils:: msrvs:: Msrv ;
2
3
use 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} ;
4
5
use rustc_errors:: Applicability ;
5
6
use rustc_hir:: { BorrowKind , Expr , ExprKind , Mutability , Ty , TyKind } ;
6
7
use rustc_lint:: LateContext ;
@@ -13,16 +14,12 @@ pub(super) fn check<'tcx>(
13
14
expr : & ' tcx Expr < ' _ > ,
14
15
cast_expr : & ' tcx Expr < ' _ > ,
15
16
cast_to : & ' tcx Ty < ' _ > ,
17
+ msrv : & Msrv ,
16
18
) -> bool {
17
19
if matches ! ( cast_to. kind, TyKind :: Ptr ( _) )
18
20
&& let ExprKind :: AddrOf ( BorrowKind :: Ref , mutability, e) = cast_expr. kind
19
- && let Some ( std_or_core) = std_or_core ( cx)
20
21
&& !is_lint_allowed ( cx, BORROW_AS_PTR , expr. hir_id )
21
22
{
22
- let macro_name = match mutability {
23
- Mutability :: Not => "addr_of" ,
24
- Mutability :: Mut => "addr_of_mut" ,
25
- } ;
26
23
let mut app = Applicability :: MachineApplicable ;
27
24
let snip = snippet_with_context ( cx, e. span , cast_expr. span . ctxt ( ) , ".." , & mut app) . 0 ;
28
25
// Fix #9884
@@ -35,13 +32,30 @@ pub(super) fn check<'tcx>(
35
32
return false ;
36
33
}
37
34
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
+
38
52
span_lint_and_sugg (
39
53
cx,
40
54
BORROW_AS_PTR ,
41
55
expr. span ,
42
56
"borrow as raw pointer" ,
43
57
"try" ,
44
- format ! ( "{std_or_core}::ptr::{macro_name}!({snip})" ) ,
58
+ suggestion ,
45
59
Applicability :: MachineApplicable ,
46
60
) ;
47
61
return true ;
0 commit comments