|
1 | 1 | use std::str::FromStr; |
2 | 2 |
|
3 | 3 | use rustc_abi::ExternAbi; |
4 | | -use rustc_ast::attr::list_contains_name; |
5 | 4 | use rustc_ast::expand::autodiff_attrs::{ |
6 | 5 | AutoDiffAttrs, DiffActivity, DiffMode, valid_input_activity, valid_ret_activity, |
7 | 6 | }; |
@@ -385,24 +384,20 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs { |
385 | 384 | let segments = |
386 | 385 | set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>(); |
387 | 386 | match segments.as_slice() { |
388 | | - [sym::arm, sym::a32] | [sym::arm, sym::t32] => { |
389 | | - if !tcx.sess.target.has_thumb_interworking { |
390 | | - struct_span_code_err!( |
391 | | - tcx.dcx(), |
392 | | - attr.span, |
393 | | - E0779, |
394 | | - "target does not support `#[instruction_set]`" |
395 | | - ) |
396 | | - .emit(); |
397 | | - None |
398 | | - } else if segments[1] == sym::a32 { |
399 | | - Some(InstructionSetAttr::ArmA32) |
400 | | - } else if segments[1] == sym::t32 { |
401 | | - Some(InstructionSetAttr::ArmT32) |
402 | | - } else { |
403 | | - unreachable!() |
404 | | - } |
| 387 | + [sym::arm, sym::a32 | sym::t32] |
| 388 | + if !tcx.sess.target.has_thumb_interworking => |
| 389 | + { |
| 390 | + struct_span_code_err!( |
| 391 | + tcx.dcx(), |
| 392 | + attr.span, |
| 393 | + E0779, |
| 394 | + "target does not support `#[instruction_set]`" |
| 395 | + ) |
| 396 | + .emit(); |
| 397 | + None |
405 | 398 | } |
| 399 | + [sym::arm, sym::a32] => Some(InstructionSetAttr::ArmA32), |
| 400 | + [sym::arm, sym::t32] => Some(InstructionSetAttr::ArmT32), |
406 | 401 | _ => { |
407 | 402 | struct_span_code_err!( |
408 | 403 | tcx.dcx(), |
@@ -544,25 +539,27 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs { |
544 | 539 | } |
545 | 540 |
|
546 | 541 | if attr.is_word() { |
547 | | - InlineAttr::Hint |
548 | | - } else if let Some(ref items) = attr.meta_item_list() { |
549 | | - inline_span = Some(attr.span); |
550 | | - if items.len() != 1 { |
551 | | - struct_span_code_err!(tcx.dcx(), attr.span, E0534, "expected one argument").emit(); |
552 | | - InlineAttr::None |
553 | | - } else if list_contains_name(items, sym::always) { |
554 | | - InlineAttr::Always |
555 | | - } else if list_contains_name(items, sym::never) { |
556 | | - InlineAttr::Never |
557 | | - } else { |
558 | | - struct_span_code_err!(tcx.dcx(), items[0].span(), E0535, "invalid argument") |
559 | | - .with_help("valid inline arguments are `always` and `never`") |
560 | | - .emit(); |
| 542 | + return InlineAttr::Hint; |
| 543 | + } |
| 544 | + let Some(ref items) = attr.meta_item_list() else { |
| 545 | + return ia; |
| 546 | + }; |
561 | 547 |
|
562 | | - InlineAttr::None |
563 | | - } |
| 548 | + inline_span = Some(attr.span); |
| 549 | + let [item] = &items[..] else { |
| 550 | + struct_span_code_err!(tcx.dcx(), attr.span, E0534, "expected one argument").emit(); |
| 551 | + return InlineAttr::None; |
| 552 | + }; |
| 553 | + if item.has_name(sym::always) { |
| 554 | + InlineAttr::Always |
| 555 | + } else if item.has_name(sym::never) { |
| 556 | + InlineAttr::Never |
564 | 557 | } else { |
565 | | - ia |
| 558 | + struct_span_code_err!(tcx.dcx(), item.span(), E0535, "invalid argument") |
| 559 | + .with_help("valid inline arguments are `always` and `never`") |
| 560 | + .emit(); |
| 561 | + |
| 562 | + InlineAttr::None |
566 | 563 | } |
567 | 564 | }); |
568 | 565 | codegen_fn_attrs.inline = attrs.iter().fold(codegen_fn_attrs.inline, |ia, attr| { |
@@ -594,23 +591,25 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs { |
594 | 591 | let err = |sp, s| struct_span_code_err!(tcx.dcx(), sp, E0722, "{}", s).emit(); |
595 | 592 | if attr.is_word() { |
596 | 593 | err(attr.span, "expected one argument"); |
597 | | - ia |
598 | | - } else if let Some(ref items) = attr.meta_item_list() { |
599 | | - inline_span = Some(attr.span); |
600 | | - if items.len() != 1 { |
601 | | - err(attr.span, "expected one argument"); |
602 | | - OptimizeAttr::Default |
603 | | - } else if list_contains_name(items, sym::size) { |
604 | | - OptimizeAttr::Size |
605 | | - } else if list_contains_name(items, sym::speed) { |
606 | | - OptimizeAttr::Speed |
607 | | - } else if list_contains_name(items, sym::none) { |
608 | | - OptimizeAttr::DoNotOptimize |
609 | | - } else { |
610 | | - err(items[0].span(), "invalid argument"); |
611 | | - OptimizeAttr::Default |
612 | | - } |
| 594 | + return ia; |
| 595 | + } |
| 596 | + let Some(ref items) = attr.meta_item_list() else { |
| 597 | + return OptimizeAttr::Default; |
| 598 | + }; |
| 599 | + |
| 600 | + inline_span = Some(attr.span); |
| 601 | + let [item] = &items[..] else { |
| 602 | + err(attr.span, "expected one argument"); |
| 603 | + return OptimizeAttr::Default; |
| 604 | + }; |
| 605 | + if item.has_name(sym::size) { |
| 606 | + OptimizeAttr::Size |
| 607 | + } else if item.has_name(sym::speed) { |
| 608 | + OptimizeAttr::Speed |
| 609 | + } else if item.has_name(sym::none) { |
| 610 | + OptimizeAttr::DoNotOptimize |
613 | 611 | } else { |
| 612 | + err(item.span(), "invalid argument"); |
614 | 613 | OptimizeAttr::Default |
615 | 614 | } |
616 | 615 | }); |
@@ -762,18 +761,13 @@ fn should_inherit_track_caller(tcx: TyCtxt<'_>, def_id: DefId) -> bool { |
762 | 761 |
|
763 | 762 | fn check_link_ordinal(tcx: TyCtxt<'_>, attr: &hir::Attribute) -> Option<u16> { |
764 | 763 | use rustc_ast::{LitIntType, LitKind, MetaItemLit}; |
765 | | - let meta_item_list = attr.meta_item_list(); |
766 | | - let meta_item_list = meta_item_list.as_deref(); |
767 | | - let sole_meta_list = match meta_item_list { |
768 | | - Some([item]) => item.lit(), |
769 | | - Some(_) => { |
770 | | - tcx.dcx().emit_err(errors::InvalidLinkOrdinalNargs { span: attr.span }); |
771 | | - return None; |
772 | | - } |
773 | | - _ => None, |
| 764 | + let meta_item_list = attr.meta_item_list()?; |
| 765 | + let [sole_meta_list] = &meta_item_list[..] else { |
| 766 | + tcx.dcx().emit_err(errors::InvalidLinkOrdinalNargs { span: attr.span }); |
| 767 | + return None; |
774 | 768 | }; |
775 | 769 | if let Some(MetaItemLit { kind: LitKind::Int(ordinal, LitIntType::Unsuffixed), .. }) = |
776 | | - sole_meta_list |
| 770 | + sole_meta_list.lit() |
777 | 771 | { |
778 | 772 | // According to the table at |
779 | 773 | // https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#import-header, the |
|
0 commit comments