rustc_attr_parsing/attributes/
rustc_internal.rs1use super::prelude::*;
2use super::util::parse_single_integer;
3
4pub(crate) struct RustcMainParser;
5
6impl<S: Stage> NoArgsAttributeParser<S> for RustcMainParser {
7 const PATH: &'static [Symbol] = &[sym::rustc_main];
8 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
9 const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Fn)]);
10 const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcMain;
11}
12
13pub(crate) struct RustcLayoutScalarValidRangeStartParser;
14
15impl<S: Stage> SingleAttributeParser<S> for RustcLayoutScalarValidRangeStartParser {
16 const PATH: &'static [Symbol] = &[sym::rustc_layout_scalar_valid_range_start];
17 const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
18 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
19 const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
20 const TEMPLATE: AttributeTemplate = template!(List: &["start"]);
21
22 fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
23 parse_single_integer(cx, args)
24 .map(|n| AttributeKind::RustcLayoutScalarValidRangeStart(Box::new(n), cx.attr_span))
25 }
26}
27
28pub(crate) struct RustcLayoutScalarValidRangeEndParser;
29
30impl<S: Stage> SingleAttributeParser<S> for RustcLayoutScalarValidRangeEndParser {
31 const PATH: &'static [Symbol] = &[sym::rustc_layout_scalar_valid_range_end];
32 const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
33 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
34 const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
35 const TEMPLATE: AttributeTemplate = template!(List: &["end"]);
36
37 fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
38 parse_single_integer(cx, args)
39 .map(|n| AttributeKind::RustcLayoutScalarValidRangeEnd(Box::new(n), cx.attr_span))
40 }
41}
42
43pub(crate) struct RustcObjectLifetimeDefaultParser;
44
45impl<S: Stage> SingleAttributeParser<S> for RustcObjectLifetimeDefaultParser {
46 const PATH: &[rustc_span::Symbol] = &[sym::rustc_object_lifetime_default];
47 const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
48 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
49 const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
50 const TEMPLATE: AttributeTemplate = template!(Word);
51
52 fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
53 if let Err(span) = args.no_args() {
54 cx.expected_no_args(span);
55 return None;
56 }
57
58 Some(AttributeKind::RustcObjectLifetimeDefault)
59 }
60}
61
62pub(crate) struct RustcSimdMonomorphizeLaneLimitParser;
63
64impl<S: Stage> SingleAttributeParser<S> for RustcSimdMonomorphizeLaneLimitParser {
65 const PATH: &[Symbol] = &[sym::rustc_simd_monomorphize_lane_limit];
66 const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
67 const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
68 const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Struct)]);
69 const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
70
71 fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
72 let ArgParser::NameValue(nv) = args else {
73 cx.expected_name_value(cx.attr_span, None);
74 return None;
75 };
76 Some(AttributeKind::RustcSimdMonomorphizeLaneLimit(cx.parse_limit_int(nv)?))
77 }
78}