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