rustc_attr_parsing/attributes/
rustc_internal.rs1use 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}