@@ -10,16 +10,16 @@ use std::collections::hash_map::Entry;
1010use rustc_ast:: token:: TokenKind ;
1111use rustc_ast:: tokenstream:: TokenTree ;
1212use rustc_ast:: {
13- AttrKind , AttrStyle , Attribute , LitKind , MetaItemInner , MetaItemKind , MetaItemLit , ast ,
13+ ast , AttrKind , AttrStyle , Attribute , LitKind , MetaItemInner , MetaItemKind , MetaItemLit ,
1414} ;
1515use rustc_data_structures:: fx:: FxHashMap ;
1616use rustc_errors:: { Applicability , DiagCtxtHandle , IntoDiagArg , MultiSpan , StashKey } ;
17- use rustc_feature:: { AttributeDuplicates , AttributeType , BUILTIN_ATTRIBUTE_MAP , BuiltinAttribute } ;
17+ use rustc_feature:: { AttributeDuplicates , AttributeType , BuiltinAttribute , BUILTIN_ATTRIBUTE_MAP } ;
1818use rustc_hir:: def_id:: LocalModDefId ;
1919use rustc_hir:: intravisit:: { self , Visitor } ;
2020use rustc_hir:: {
21- self as hir, self , AssocItemKind , CRATE_HIR_ID , CRATE_OWNER_ID , FnSig , ForeignItem , HirId ,
22- Item , ItemKind , MethodKind , Safety , Target , TraitItem ,
21+ self , self as hir, AssocItemKind , FnSig , FnSig , ForeignItem , ForeignItem , HirId , Item ,
22+ ItemKind , MethodKind , Safety , Target , Target , TraitItem , CRATE_HIR_ID , CRATE_OWNER_ID ,
2323} ;
2424use rustc_macros:: LintDiagnostic ;
2525use rustc_middle:: hir:: nested_filter;
@@ -34,8 +34,8 @@ use rustc_session::lint::builtin::{
3434 UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES , UNUSED_ATTRIBUTES ,
3535} ;
3636use rustc_session:: parse:: feature_err;
37- use rustc_span:: symbol:: { Symbol , kw, sym} ;
38- use rustc_span:: { BytePos , DUMMY_SP , Span } ;
37+ use rustc_span:: symbol:: { kw, sym, Symbol } ;
38+ use rustc_span:: { BytePos , Span , DUMMY_SP } ;
3939use rustc_target:: abi:: Size ;
4040use rustc_target:: spec:: abi:: Abi ;
4141use rustc_trait_selection:: error_reporting:: InferCtxtErrorExt ;
@@ -352,8 +352,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
352352 }
353353
354354 fn inline_attr_str_error_without_macro_def ( & self , hir_id : HirId , attr : & Attribute , sym : & str ) {
355- self . tcx
356- . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: IgnoredAttr { sym } ) ;
355+ self . tcx . emit_node_span_lint (
356+ UNUSED_ATTRIBUTES ,
357+ hir_id,
358+ attr. span ,
359+ errors:: IgnoredAttr { sym } ,
360+ ) ;
357361 }
358362
359363 /// Checks if `#[diagnostic::do_not_recommend]` is applied on a trait impl.
@@ -1420,10 +1424,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
14201424 _ => {
14211425 // FIXME: #[cold] was previously allowed on non-functions and some crates used
14221426 // this, so only emit a warning.
1423- self . tcx . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: Cold {
1424- span,
1425- on_crate : hir_id == CRATE_HIR_ID ,
1426- } ) ;
1427+ self . tcx . emit_node_span_lint (
1428+ UNUSED_ATTRIBUTES ,
1429+ hir_id,
1430+ attr. span ,
1431+ errors:: Cold { span, on_crate : hir_id == CRATE_HIR_ID } ,
1432+ ) ;
14271433 }
14281434 }
14291435 }
@@ -1438,9 +1444,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
14381444 return ;
14391445 }
14401446
1441- self . tcx . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: Link {
1442- span : ( target != Target :: ForeignMod ) . then_some ( span) ,
1443- } ) ;
1447+ self . tcx . emit_node_span_lint (
1448+ UNUSED_ATTRIBUTES ,
1449+ hir_id,
1450+ attr. span ,
1451+ errors:: Link { span : ( target != Target :: ForeignMod ) . then_some ( span) } ,
1452+ ) ;
14441453 }
14451454
14461455 /// Checks if `#[link_name]` is applied to an item other than a foreign function or static.
@@ -1910,7 +1919,11 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
19101919 || ( int_reprs == 1
19111920 && is_c
19121921 && item. is_some_and ( |item| {
1913- if let ItemLike :: Item ( item) = item { is_c_like_enum ( item) } else { false }
1922+ if let ItemLike :: Item ( item) = item {
1923+ is_c_like_enum ( item)
1924+ } else {
1925+ false
1926+ }
19141927 } ) )
19151928 {
19161929 self . tcx . emit_node_span_lint (
@@ -2250,10 +2263,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
22502263 return ;
22512264 } ;
22522265
2253- self . tcx . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: Unused {
2254- attr_span : attr. span ,
2255- note,
2256- } ) ;
2266+ self . tcx . emit_node_span_lint (
2267+ UNUSED_ATTRIBUTES ,
2268+ hir_id,
2269+ attr. span ,
2270+ errors:: Unused { attr_span : attr. span , note } ,
2271+ ) ;
22572272 }
22582273
22592274 /// A best effort attempt to create an error for a mismatching proc macro signature.
@@ -2409,40 +2424,75 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
24092424 }
24102425 }
24112426
2412- fn check_instruction_set ( & self , attr : & Attribute , _item : Option < ItemLike < ' _ > > ) {
2413- if let AttrKind :: Normal ( ref p) = attr. kind {
2414- let inner_tokens = p. item . args . inner_tokens ( ) ;
2415- let mut tokens = inner_tokens. trees ( ) ;
2416-
2417- // Valid item for `instruction_set()` is:
2418- // - arm::a32
2419- // - arm::t32
2420- match ( tokens. next ( ) , tokens. next ( ) , tokens. next ( ) ) {
2421- (
2422- Some ( TokenTree :: Token ( first_token, _) ) ,
2423- Some ( TokenTree :: Token ( second_token, _) ) ,
2424- Some ( TokenTree :: Token ( third_token, _) ) ,
2425- ) => match ( first_token. ident ( ) , second_token. kind . clone ( ) , third_token. ident ( ) ) {
2426- ( Some ( first_ident) , TokenKind :: PathSep , Some ( third_ident) )
2427- if first_ident. 0 . name == sym:: arm =>
2428- {
2429- if third_ident. 0 . name == sym:: a32 || third_ident. 0 . name == sym:: t32 {
2430- return ;
2431- } else {
2432- self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2433- }
2434- }
2435- _ => {
2436- self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2427+ fn check_instruction_set ( & self , attr : & Attribute , item : Option < ItemLike < ' _ > > ) {
2428+ // Ensure the attribute is applied to a function or closure
2429+ match item {
2430+ Some ( ItemLike :: Item ( inner_item) ) => match inner_item. kind {
2431+ ItemKind :: Fn ( _, _, _) => {
2432+ // Validate the tokens for `instruction_set()` attribute
2433+ if let AttrKind :: Normal ( ref p) = attr. kind {
2434+ let inner_tokens = p. item . args . inner_tokens ( ) ;
2435+ let mut tokens = inner_tokens. trees ( ) ;
2436+
2437+ match ( tokens. next ( ) , tokens. next ( ) , tokens. next ( ) ) {
2438+ (
2439+ Some ( TokenTree :: Token ( first_token, _) ) ,
2440+ Some ( TokenTree :: Token ( second_token, _) ) ,
2441+ Some ( TokenTree :: Token ( third_token, _) ) ,
2442+ ) => match (
2443+ first_token. ident ( ) ,
2444+ second_token. kind . clone ( ) ,
2445+ third_token. ident ( ) ,
2446+ ) {
2447+ ( Some ( first_ident) , TokenKind :: PathSep , Some ( third_ident) )
2448+ if first_ident. 0 . name == sym:: arm =>
2449+ {
2450+ if third_ident. 0 . name == sym:: a32
2451+ || third_ident. 0 . name == sym:: t32
2452+ {
2453+ return ;
2454+ } else {
2455+ self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet {
2456+ span : attr. span ,
2457+ } ) ;
2458+ }
2459+ }
2460+ _ => {
2461+ self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet {
2462+ span : attr. span ,
2463+ } ) ;
2464+ }
2465+ } ,
2466+ ( None , None , None ) => {
2467+ self . dcx ( )
2468+ . emit_err ( errors:: EmptyInstructionSet { span : attr. span } ) ;
2469+ }
2470+ _ => {
2471+ self . dcx ( )
2472+ . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2473+ }
2474+ } ;
24372475 }
2438- } ,
2439- ( None , None , None ) => {
2440- self . dcx ( ) . emit_err ( errors:: EmptyInstructionSet { span : attr. span } ) ;
24412476 }
24422477 _ => {
2443- self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2478+ self . dcx ( ) . emit_err ( errors:: InvalidTargetForInstructionSet {
2479+ span : attr. span ,
2480+ item_kind : inner_item. kind . descr ( ) ,
2481+ } ) ;
2482+ return ;
24442483 }
2445- } ;
2484+ } ,
2485+ Some ( ItemLike :: ForeignItem ) => {
2486+ self . dcx ( ) . emit_err ( errors:: InvalidTargetForInstructionSet {
2487+ span : attr. span ,
2488+ item_kind : "foreign item" ,
2489+ } ) ;
2490+ return ;
2491+ }
2492+ None => {
2493+ self . dcx ( ) . emit_err ( errors:: AttributeNotAllowed { span : attr. span } ) ;
2494+ return ;
2495+ }
24462496 }
24472497 }
24482498}
0 commit comments