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}