@@ -7,65 +7,70 @@ use rustc_ast::tokenstream::DelimSpan;
7
7
use rustc_ast:: MetaItemKind ;
8
8
use rustc_ast:: { self as ast, AttrArgs , AttrArgsEq , Attribute , DelimArgs , MetaItem , Safety } ;
9
9
use rustc_errors:: { Applicability , FatalError , PResult } ;
10
- use rustc_feature:: { AttributeSafety , AttributeTemplate , BuiltinAttribute , BUILTIN_ATTRIBUTE_MAP } ;
10
+ use rustc_feature:: {
11
+ AttributeSafety , AttributeTemplate , BuiltinAttribute , Features , BUILTIN_ATTRIBUTE_MAP ,
12
+ } ;
11
13
use rustc_session:: errors:: report_lit_error;
12
14
use rustc_session:: lint:: builtin:: { ILL_FORMED_ATTRIBUTE_INPUT , UNSAFE_ATTR_OUTSIDE_UNSAFE } ;
13
15
use rustc_session:: lint:: BuiltinLintDiag ;
14
16
use rustc_session:: parse:: ParseSess ;
15
17
use rustc_span:: { sym, BytePos , Span , Symbol } ;
16
18
17
- pub fn check_attr ( psess : & ParseSess , attr : & Attribute ) {
19
+ pub fn check_attr ( features : & Features , psess : & ParseSess , attr : & Attribute ) {
18
20
if attr. is_doc_comment ( ) {
19
21
return ;
20
22
}
21
23
22
24
let attr_info = attr. ident ( ) . and_then ( |ident| BUILTIN_ATTRIBUTE_MAP . get ( & ident. name ) ) ;
23
25
let attr_item = attr. get_normal_item ( ) ;
24
26
25
- let is_unsafe_attr =
26
- attr_info. map ( |attr| attr. safety == AttributeSafety :: Unsafe ) . unwrap_or ( false ) ;
27
+ let is_unsafe_attr = attr_info. is_some_and ( |attr| attr. safety == AttributeSafety :: Unsafe ) ;
27
28
28
- if is_unsafe_attr {
29
- if let ast:: Safety :: Default = attr_item. unsafety {
30
- let path_span = attr_item. path . span ;
29
+ if features. unsafe_attributes {
30
+ if is_unsafe_attr {
31
+ if let ast:: Safety :: Default = attr_item. unsafety {
32
+ let path_span = attr_item. path . span ;
31
33
32
- // If the `attr_item`'s span is not from a macro, then just suggest
33
- // wrapping it in `unsafe(...)`. Otherwise, we suggest putting the
34
- // `unsafe(`, `)` right after and right before the opening and closing
35
- // square bracket respectively.
36
- let diag_span = if attr_item. span ( ) . can_be_used_for_suggestions ( ) {
37
- attr_item. span ( )
38
- } else {
39
- attr. span . with_lo ( attr. span . lo ( ) + BytePos ( 2 ) ) . with_hi ( attr. span . hi ( ) - BytePos ( 1 ) )
40
- } ;
34
+ // If the `attr_item`'s span is not from a macro, then just suggest
35
+ // wrapping it in `unsafe(...)`. Otherwise, we suggest putting the
36
+ // `unsafe(`, `)` right after and right before the opening and closing
37
+ // square bracket respectively.
38
+ let diag_span = if attr_item. span ( ) . can_be_used_for_suggestions ( ) {
39
+ attr_item. span ( )
40
+ } else {
41
+ attr. span
42
+ . with_lo ( attr. span . lo ( ) + BytePos ( 2 ) )
43
+ . with_hi ( attr. span . hi ( ) - BytePos ( 1 ) )
44
+ } ;
41
45
42
- if attr. span . at_least_rust_2024 ( ) {
43
- psess. dcx . emit_err ( errors:: UnsafeAttrOutsideUnsafe {
44
- span : path_span,
45
- suggestion : errors:: UnsafeAttrOutsideUnsafeSuggestion {
46
- left : diag_span. shrink_to_lo ( ) ,
47
- right : diag_span. shrink_to_hi ( ) ,
48
- } ,
46
+ if attr. span . at_least_rust_2024 ( ) {
47
+ psess. dcx . emit_err ( errors:: UnsafeAttrOutsideUnsafe {
48
+ span : path_span,
49
+ suggestion : errors:: UnsafeAttrOutsideUnsafeSuggestion {
50
+ left : diag_span. shrink_to_lo ( ) ,
51
+ right : diag_span. shrink_to_hi ( ) ,
52
+ } ,
53
+ } ) ;
54
+ } else {
55
+ psess. buffer_lint (
56
+ UNSAFE_ATTR_OUTSIDE_UNSAFE ,
57
+ path_span,
58
+ ast:: CRATE_NODE_ID ,
59
+ BuiltinLintDiag :: UnsafeAttrOutsideUnsafe {
60
+ attribute_name_span : path_span,
61
+ sugg_spans : ( diag_span. shrink_to_lo ( ) , diag_span. shrink_to_hi ( ) ) ,
62
+ } ,
63
+ ) ;
64
+ }
65
+ }
66
+ } else {
67
+ if let Safety :: Unsafe ( unsafe_span) = attr_item. unsafety {
68
+ psess. dcx . emit_err ( errors:: InvalidAttrUnsafe {
69
+ span : unsafe_span,
70
+ name : attr_item. path . clone ( ) ,
49
71
} ) ;
50
- } else {
51
- psess. buffer_lint (
52
- UNSAFE_ATTR_OUTSIDE_UNSAFE ,
53
- path_span,
54
- ast:: CRATE_NODE_ID ,
55
- BuiltinLintDiag :: UnsafeAttrOutsideUnsafe {
56
- attribute_name_span : path_span,
57
- sugg_spans : ( diag_span. shrink_to_lo ( ) , diag_span. shrink_to_hi ( ) ) ,
58
- } ,
59
- ) ;
60
72
}
61
73
}
62
- } else {
63
- if let Safety :: Unsafe ( unsafe_span) = attr_item. unsafety {
64
- psess. dcx . emit_err ( errors:: InvalidAttrUnsafe {
65
- span : unsafe_span,
66
- name : attr_item. path . clone ( ) ,
67
- } ) ;
68
- }
69
74
}
70
75
71
76
// Check input tokens for built-in and key-value attributes.
0 commit comments