1
1
use hir:: InFile ;
2
+ use syntax:: ast;
2
3
3
- use crate :: { Diagnostic , DiagnosticCode , DiagnosticsContext , Severity } ;
4
+ use crate :: { adjusted_display_range , Diagnostic , DiagnosticCode , DiagnosticsContext , Severity } ;
4
5
5
6
// Diagnostic: trait-impl-incorrect-safety
6
7
//
@@ -9,15 +10,28 @@ pub(crate) fn trait_impl_incorrect_safety(
9
10
ctx : & DiagnosticsContext < ' _ > ,
10
11
d : & hir:: TraitImplIncorrectSafety ,
11
12
) -> Diagnostic {
12
- Diagnostic :: new_with_syntax_node_ptr (
13
- ctx,
13
+ Diagnostic :: new (
14
14
DiagnosticCode :: Ra ( "trait-impl-incorrect-safety" , Severity :: Error ) ,
15
15
if d. should_be_safe {
16
16
"unsafe impl for safe trait"
17
17
} else {
18
18
"impl for unsafe trait needs to be unsafe"
19
19
} ,
20
- InFile :: new ( d. file_id , d. impl_ . clone ( ) . into ( ) ) ,
20
+ adjusted_display_range :: < ast:: Impl > (
21
+ ctx,
22
+ InFile { file_id : d. file_id , value : d. impl_ . syntax_node_ptr ( ) } ,
23
+ & |impl_| {
24
+ if d. should_be_safe {
25
+ Some ( match ( impl_. unsafe_token ( ) , impl_. impl_token ( ) ) {
26
+ ( None , None ) => return None ,
27
+ ( None , Some ( t) ) | ( Some ( t) , None ) => t. text_range ( ) ,
28
+ ( Some ( t1) , Some ( t2) ) => t1. text_range ( ) . cover ( t2. text_range ( ) ) ,
29
+ } )
30
+ } else {
31
+ impl_. impl_token ( ) . map ( |t| t. text_range ( ) )
32
+ }
33
+ } ,
34
+ ) ,
21
35
)
22
36
}
23
37
@@ -35,10 +49,10 @@ unsafe trait Unsafe {}
35
49
impl Safe for () {}
36
50
37
51
impl Unsafe for () {}
38
- //^^^^^^^^^^^^^^^^^^^^^ error: impl for unsafe trait needs to be unsafe
52
+ //^^^^ error: impl for unsafe trait needs to be unsafe
39
53
40
54
unsafe impl Safe for () {}
41
- //^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unsafe impl for safe trait
55
+ //^^^^^^^^^^^ error: unsafe impl for safe trait
42
56
43
57
unsafe impl Unsafe for () {}
44
58
"# ,
@@ -57,20 +71,20 @@ struct L<'l>;
57
71
impl<T> Drop for S<T> {}
58
72
59
73
impl<#[may_dangle] T> Drop for S<T> {}
60
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: impl for unsafe trait needs to be unsafe
74
+ //^^^^ error: impl for unsafe trait needs to be unsafe
61
75
62
76
unsafe impl<T> Drop for S<T> {}
63
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unsafe impl for safe trait
77
+ //^^^^^^^^^^^ error: unsafe impl for safe trait
64
78
65
79
unsafe impl<#[may_dangle] T> Drop for S<T> {}
66
80
67
81
impl<'l> Drop for L<'l> {}
68
82
69
83
impl<#[may_dangle] 'l> Drop for L<'l> {}
70
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: impl for unsafe trait needs to be unsafe
84
+ //^^^^ error: impl for unsafe trait needs to be unsafe
71
85
72
86
unsafe impl<'l> Drop for L<'l> {}
73
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unsafe impl for safe trait
87
+ //^^^^^^^^^^^ error: unsafe impl for safe trait
74
88
75
89
unsafe impl<#[may_dangle] 'l> Drop for L<'l> {}
76
90
"# ,
@@ -86,14 +100,14 @@ trait Trait {}
86
100
impl !Trait for () {}
87
101
88
102
unsafe impl !Trait for () {}
89
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unsafe impl for safe trait
103
+ //^^^^^^^^^^^ error: unsafe impl for safe trait
90
104
91
105
unsafe trait UnsafeTrait {}
92
106
93
107
impl !UnsafeTrait for () {}
94
108
95
109
unsafe impl !UnsafeTrait for () {}
96
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unsafe impl for safe trait
110
+ //^^^^^^^^^^^ error: unsafe impl for safe trait
97
111
98
112
"# ,
99
113
) ;
@@ -108,7 +122,7 @@ struct S;
108
122
impl S {}
109
123
110
124
unsafe impl S {}
111
- //^^^^^^^^^^^^^^^^ error: unsafe impl for safe trait
125
+ //^^^^^^^^^^^ error: unsafe impl for safe trait
112
126
"# ,
113
127
) ;
114
128
}
0 commit comments