@@ -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 , CRATE_HIR_ID , CRATE_OWNER_ID , FnSig , ForeignItem , HirId , Item , ItemKind ,
22
- MethodKind , Safety , Target , TraitItem ,
21
+ self as hir, self , FnSig , ForeignItem , HirId , Item , ItemKind , MethodKind , Safety , Target ,
22
+ 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 ;
@@ -349,8 +349,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
349
349
}
350
350
351
351
fn inline_attr_str_error_without_macro_def ( & self , hir_id : HirId , attr : & Attribute , sym : & str ) {
352
- self . tcx
353
- . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: IgnoredAttr { sym } ) ;
352
+ self . tcx . emit_node_span_lint (
353
+ UNUSED_ATTRIBUTES ,
354
+ hir_id,
355
+ attr. span ,
356
+ errors:: IgnoredAttr { sym } ,
357
+ ) ;
354
358
}
355
359
356
360
/// Checks if `#[diagnostic::do_not_recommend]` is applied on a trait impl.
@@ -1394,10 +1398,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
1394
1398
_ => {
1395
1399
// FIXME: #[cold] was previously allowed on non-functions and some crates used
1396
1400
// this, so only emit a warning.
1397
- self . tcx . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: Cold {
1398
- span,
1399
- on_crate : hir_id == CRATE_HIR_ID ,
1400
- } ) ;
1401
+ self . tcx . emit_node_span_lint (
1402
+ UNUSED_ATTRIBUTES ,
1403
+ hir_id,
1404
+ attr. span ,
1405
+ errors:: Cold { span, on_crate : hir_id == CRATE_HIR_ID } ,
1406
+ ) ;
1401
1407
}
1402
1408
}
1403
1409
}
@@ -1412,9 +1418,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
1412
1418
return ;
1413
1419
}
1414
1420
1415
- self . tcx . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: Link {
1416
- span : ( target != Target :: ForeignMod ) . then_some ( span) ,
1417
- } ) ;
1421
+ self . tcx . emit_node_span_lint (
1422
+ UNUSED_ATTRIBUTES ,
1423
+ hir_id,
1424
+ attr. span ,
1425
+ errors:: Link { span : ( target != Target :: ForeignMod ) . then_some ( span) } ,
1426
+ ) ;
1418
1427
}
1419
1428
1420
1429
/// Checks if `#[link_name]` is applied to an item other than a foreign function or static.
@@ -1884,7 +1893,11 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
1884
1893
|| ( int_reprs == 1
1885
1894
&& is_c
1886
1895
&& item. is_some_and ( |item| {
1887
- if let ItemLike :: Item ( item) = item { is_c_like_enum ( item) } else { false }
1896
+ if let ItemLike :: Item ( item) = item {
1897
+ is_c_like_enum ( item)
1898
+ } else {
1899
+ false
1900
+ }
1888
1901
} ) )
1889
1902
{
1890
1903
self . tcx . emit_node_span_lint (
@@ -2224,10 +2237,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
2224
2237
return ;
2225
2238
} ;
2226
2239
2227
- self . tcx . emit_node_span_lint ( UNUSED_ATTRIBUTES , hir_id, attr. span , errors:: Unused {
2228
- attr_span : attr. span ,
2229
- note,
2230
- } ) ;
2240
+ self . tcx . emit_node_span_lint (
2241
+ UNUSED_ATTRIBUTES ,
2242
+ hir_id,
2243
+ attr. span ,
2244
+ errors:: Unused { attr_span : attr. span , note } ,
2245
+ ) ;
2231
2246
}
2232
2247
2233
2248
/// A best effort attempt to create an error for a mismatching proc macro signature.
@@ -2383,40 +2398,75 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
2383
2398
}
2384
2399
}
2385
2400
2386
- fn check_instruction_set ( & self , attr : & Attribute , _item : Option < ItemLike < ' _ > > ) {
2387
- if let AttrKind :: Normal ( ref p) = attr. kind {
2388
- let inner_tokens = p. item . args . inner_tokens ( ) ;
2389
- let mut tokens = inner_tokens. trees ( ) ;
2390
-
2391
- // Valid item for `instruction_set()` is:
2392
- // - arm::a32
2393
- // - arm::t32
2394
- match ( tokens. next ( ) , tokens. next ( ) , tokens. next ( ) ) {
2395
- (
2396
- Some ( TokenTree :: Token ( first_token, _) ) ,
2397
- Some ( TokenTree :: Token ( second_token, _) ) ,
2398
- Some ( TokenTree :: Token ( third_token, _) ) ,
2399
- ) => match ( first_token. ident ( ) , second_token. kind . clone ( ) , third_token. ident ( ) ) {
2400
- ( Some ( first_ident) , TokenKind :: PathSep , Some ( third_ident) )
2401
- if first_ident. 0 . name == sym:: arm =>
2402
- {
2403
- if third_ident. 0 . name == sym:: a32 || third_ident. 0 . name == sym:: t32 {
2404
- return ;
2405
- } else {
2406
- self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2407
- }
2408
- }
2409
- _ => {
2410
- self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2401
+ fn check_instruction_set ( & self , attr : & Attribute , item : Option < ItemLike < ' _ > > ) {
2402
+ // Ensure the attribute is applied to a function or closure
2403
+ match item {
2404
+ Some ( ItemLike :: Item ( inner_item) ) => match inner_item. kind {
2405
+ ItemKind :: Fn ( _, _, _) => {
2406
+ // Validate the tokens for `instruction_set()` attribute
2407
+ if let AttrKind :: Normal ( ref p) = attr. kind {
2408
+ let inner_tokens = p. item . args . inner_tokens ( ) ;
2409
+ let mut tokens = inner_tokens. trees ( ) ;
2410
+
2411
+ match ( tokens. next ( ) , tokens. next ( ) , tokens. next ( ) ) {
2412
+ (
2413
+ Some ( TokenTree :: Token ( first_token, _) ) ,
2414
+ Some ( TokenTree :: Token ( second_token, _) ) ,
2415
+ Some ( TokenTree :: Token ( third_token, _) ) ,
2416
+ ) => match (
2417
+ first_token. ident ( ) ,
2418
+ second_token. kind . clone ( ) ,
2419
+ third_token. ident ( ) ,
2420
+ ) {
2421
+ ( Some ( first_ident) , TokenKind :: PathSep , Some ( third_ident) )
2422
+ if first_ident. 0 . name == sym:: arm =>
2423
+ {
2424
+ if third_ident. 0 . name == sym:: a32
2425
+ || third_ident. 0 . name == sym:: t32
2426
+ {
2427
+ return ;
2428
+ } else {
2429
+ self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet {
2430
+ span : attr. span ,
2431
+ } ) ;
2432
+ }
2433
+ }
2434
+ _ => {
2435
+ self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet {
2436
+ span : attr. span ,
2437
+ } ) ;
2438
+ }
2439
+ } ,
2440
+ ( None , None , None ) => {
2441
+ self . dcx ( )
2442
+ . emit_err ( errors:: EmptyInstructionSet { span : attr. span } ) ;
2443
+ }
2444
+ _ => {
2445
+ self . dcx ( )
2446
+ . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2447
+ }
2448
+ } ;
2411
2449
}
2412
- } ,
2413
- ( None , None , None ) => {
2414
- self . dcx ( ) . emit_err ( errors:: EmptyInstructionSet { span : attr. span } ) ;
2415
2450
}
2416
2451
_ => {
2417
- self . dcx ( ) . emit_err ( errors:: InvalidInstructionSet { span : attr. span } ) ;
2452
+ self . dcx ( ) . emit_err ( errors:: InvalidTargetForInstructionSet {
2453
+ span : attr. span ,
2454
+ item_kind : inner_item. kind . descr ( ) ,
2455
+ } ) ;
2456
+ return ;
2418
2457
}
2419
- } ;
2458
+ } ,
2459
+ Some ( ItemLike :: ForeignItem ) => {
2460
+ self . dcx ( ) . emit_err ( errors:: InvalidTargetForInstructionSet {
2461
+ span : attr. span ,
2462
+ item_kind : "foreign item" ,
2463
+ } ) ;
2464
+ return ;
2465
+ }
2466
+ None => {
2467
+ self . dcx ( ) . emit_err ( errors:: AttributeNotAllowed { span : attr. span } ) ;
2468
+ return ;
2469
+ }
2420
2470
}
2421
2471
}
2422
2472
}
0 commit comments