rustc_attr_parsing/attributes/
rustc_internal.rs

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