@@ -10,16 +10,16 @@ use std::collections::hash_map::Entry;
10
10
use rustc_ast:: token:: TokenKind ;
11
11
use rustc_ast:: tokenstream:: TokenTree ;
12
12
use rustc_ast:: {
13
- AttrKind , AttrStyle , Attribute , LitKind , MetaItemInner , MetaItemKind , MetaItemLit , ast ,
13
+ ast , AttrKind , AttrStyle , Attribute , LitKind , MetaItemInner , MetaItemKind , MetaItemLit ,
14
14
} ;
15
15
use rustc_data_structures:: fx:: FxHashMap ;
16
16
use 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 } ;
18
18
use rustc_hir:: def_id:: LocalModDefId ;
19
19
use rustc_hir:: intravisit:: { self , Visitor } ;
20
20
use 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 ,
23
23
} ;
24
24
use rustc_macros:: LintDiagnostic ;
25
25
use rustc_middle:: hir:: nested_filter;
@@ -34,8 +34,8 @@ use rustc_session::lint::builtin::{
34
34
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES , UNUSED_ATTRIBUTES ,
35
35
} ;
36
36
use 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 } ;
39
39
use rustc_target:: abi:: Size ;
40
40
use rustc_target:: spec:: abi:: Abi ;
41
41
use rustc_trait_selection:: error_reporting:: InferCtxtErrorExt ;
@@ -352,8 +352,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
352
352
}
353
353
354
354
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
+ ) ;
357
361
}
358
362
359
363
/// Checks if `#[diagnostic::do_not_recommend]` is applied on a trait impl.
@@ -1420,10 +1424,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
1420
1424
_ => {
1421
1425
// FIXME: #[cold] was previously allowed on non-functions and some crates used
1422
1426
// 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
+ ) ;
1427
1433
}
1428
1434
}
1429
1435
}
@@ -1438,9 +1444,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
1438
1444
return ;
1439
1445
}
1440
1446
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
+ ) ;
1444
1453
}
1445
1454
1446
1455
/// Checks if `#[link_name]` is applied to an item other than a foreign function or static.
@@ -1910,7 +1919,11 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
1910
1919
|| ( int_reprs == 1
1911
1920
&& is_c
1912
1921
&& 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
+ }
1914
1927
} ) )
1915
1928
{
1916
1929
self . tcx . emit_node_span_lint (
@@ -2250,10 +2263,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
2250
2263
return ;
2251
2264
} ;
2252
2265
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
+ ) ;
2257
2272
}
2258
2273
2259
2274
/// A best effort attempt to create an error for a mismatching proc macro signature.
@@ -2409,40 +2424,75 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
2409
2424
}
2410
2425
}
2411
2426
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
+ } ;
2437
2475
}
2438
- } ,
2439
- ( None , None , None ) => {
2440
- self . dcx ( ) . emit_err ( errors:: EmptyInstructionSet { span : attr. span } ) ;
2441
2476
}
2442
2477
_ => {
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 ;
2444
2483
}
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
+ }
2446
2496
}
2447
2497
}
2448
2498
}
0 commit comments