rustc_attr_parsing/attributes/
rustc_internal.rs

1use 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}