rustc_attr_parsing/attributes/
rustc_internal.rs

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