@@ -7,65 +7,70 @@ use rustc_ast::tokenstream::DelimSpan;
77use rustc_ast:: MetaItemKind ;
88use rustc_ast:: { self as ast, AttrArgs , AttrArgsEq , Attribute , DelimArgs , MetaItem , Safety } ;
99use 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+ } ;
1113use rustc_session:: errors:: report_lit_error;
1214use rustc_session:: lint:: builtin:: { ILL_FORMED_ATTRIBUTE_INPUT , UNSAFE_ATTR_OUTSIDE_UNSAFE } ;
1315use rustc_session:: lint:: BuiltinLintDiag ;
1416use rustc_session:: parse:: ParseSess ;
1517use rustc_span:: { sym, BytePos , Span , Symbol } ;
1618
17- pub fn check_attr ( psess : & ParseSess , attr : & Attribute ) {
19+ pub fn check_attr ( features : & Features , psess : & ParseSess , attr : & Attribute ) {
1820 if attr. is_doc_comment ( ) {
1921 return ;
2022 }
2123
2224 let attr_info = attr. ident ( ) . and_then ( |ident| BUILTIN_ATTRIBUTE_MAP . get ( & ident. name ) ) ;
2325 let attr_item = attr. get_normal_item ( ) ;
2426
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 ) ;
2728
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 ;
3133
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+ } ;
4145
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 ( ) ,
4971 } ) ;
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- ) ;
6072 }
6173 }
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- }
6974 }
7075
7176 // Check input tokens for built-in and key-value attributes.
0 commit comments