Port #[rustc_object_lifetime_default] to the new attribute parsing infrastructure
This commit is contained in:
@@ -296,6 +296,9 @@ pub enum AttributeKind {
|
|||||||
/// Represents `#[rustc_layout_scalar_valid_range_start]`.
|
/// Represents `#[rustc_layout_scalar_valid_range_start]`.
|
||||||
RustcLayoutScalarValidRangeStart(Box<u128>, Span),
|
RustcLayoutScalarValidRangeStart(Box<u128>, Span),
|
||||||
|
|
||||||
|
/// Represents `#[rustc_object_lifetime_default]`.
|
||||||
|
RustcObjectLifetimeDefault,
|
||||||
|
|
||||||
/// Represents `#[rustc_skip_during_method_dispatch]`.
|
/// Represents `#[rustc_skip_during_method_dispatch]`.
|
||||||
SkipDuringMethodDispatch { array: bool, boxed_slice: bool, span: Span },
|
SkipDuringMethodDispatch { array: bool, boxed_slice: bool, span: Span },
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ impl AttributeKind {
|
|||||||
PubTransparent(..) => Yes,
|
PubTransparent(..) => Yes,
|
||||||
RustcLayoutScalarValidRangeEnd(..) => Yes,
|
RustcLayoutScalarValidRangeEnd(..) => Yes,
|
||||||
RustcLayoutScalarValidRangeStart(..) => Yes,
|
RustcLayoutScalarValidRangeStart(..) => Yes,
|
||||||
|
RustcObjectLifetimeDefault => No,
|
||||||
SkipDuringMethodDispatch { .. } => No,
|
SkipDuringMethodDispatch { .. } => No,
|
||||||
TrackCaller(..) => Yes,
|
TrackCaller(..) => Yes,
|
||||||
Used { .. } => No,
|
Used { .. } => No,
|
||||||
|
|||||||
@@ -57,3 +57,21 @@ fn parse_rustc_layout_scalar_valid_range<S: Stage>(
|
|||||||
};
|
};
|
||||||
Some(Box::new(num.0))
|
Some(Box::new(num.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) struct RustcObjectLifetimeDefaultParser;
|
||||||
|
|
||||||
|
impl<S: Stage> SingleAttributeParser<S> for RustcObjectLifetimeDefaultParser {
|
||||||
|
const PATH: &[rustc_span::Symbol] = &[sym::rustc_object_lifetime_default];
|
||||||
|
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
|
||||||
|
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
|
||||||
|
const TEMPLATE: AttributeTemplate = template!(Word);
|
||||||
|
|
||||||
|
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
|
||||||
|
if let Err(span) = args.no_args() {
|
||||||
|
cx.expected_no_args(span);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(AttributeKind::RustcObjectLifetimeDefault)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ use crate::attributes::must_use::MustUseParser;
|
|||||||
use crate::attributes::repr::{AlignParser, ReprParser};
|
use crate::attributes::repr::{AlignParser, ReprParser};
|
||||||
use crate::attributes::rustc_internal::{
|
use crate::attributes::rustc_internal::{
|
||||||
RustcLayoutScalarValidRangeEnd, RustcLayoutScalarValidRangeStart,
|
RustcLayoutScalarValidRangeEnd, RustcLayoutScalarValidRangeStart,
|
||||||
|
RustcObjectLifetimeDefaultParser,
|
||||||
};
|
};
|
||||||
use crate::attributes::semantics::MayDangleParser;
|
use crate::attributes::semantics::MayDangleParser;
|
||||||
use crate::attributes::stability::{
|
use crate::attributes::stability::{
|
||||||
@@ -136,6 +137,7 @@ attribute_parsers!(
|
|||||||
Single<RustcForceInlineParser>,
|
Single<RustcForceInlineParser>,
|
||||||
Single<RustcLayoutScalarValidRangeEnd>,
|
Single<RustcLayoutScalarValidRangeEnd>,
|
||||||
Single<RustcLayoutScalarValidRangeStart>,
|
Single<RustcLayoutScalarValidRangeStart>,
|
||||||
|
Single<RustcObjectLifetimeDefaultParser>,
|
||||||
Single<SkipDuringMethodDispatchParser>,
|
Single<SkipDuringMethodDispatchParser>,
|
||||||
Single<TrackCallerParser>,
|
Single<TrackCallerParser>,
|
||||||
Single<TransparencyParser>,
|
Single<TransparencyParser>,
|
||||||
|
|||||||
@@ -164,7 +164,9 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||||||
}
|
}
|
||||||
Attribute::Parsed(AttributeKind::Repr(_)) => { /* handled below this loop and elsewhere */
|
Attribute::Parsed(AttributeKind::Repr(_)) => { /* handled below this loop and elsewhere */
|
||||||
}
|
}
|
||||||
|
Attribute::Parsed(AttributeKind::RustcObjectLifetimeDefault) => {
|
||||||
|
self.check_object_lifetime_default(hir_id);
|
||||||
|
}
|
||||||
&Attribute::Parsed(AttributeKind::PubTransparent(attr_span)) => {
|
&Attribute::Parsed(AttributeKind::PubTransparent(attr_span)) => {
|
||||||
self.check_rustc_pub_transparent(attr_span, span, attrs)
|
self.check_rustc_pub_transparent(attr_span, span, attrs)
|
||||||
}
|
}
|
||||||
@@ -303,7 +305,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||||||
[sym::no_implicit_prelude, ..] => {
|
[sym::no_implicit_prelude, ..] => {
|
||||||
self.check_generic_attr(hir_id, attr, target, Target::Mod)
|
self.check_generic_attr(hir_id, attr, target, Target::Mod)
|
||||||
}
|
}
|
||||||
[sym::rustc_object_lifetime_default, ..] => self.check_object_lifetime_default(hir_id),
|
|
||||||
[sym::proc_macro, ..] => {
|
[sym::proc_macro, ..] => {
|
||||||
self.check_proc_macro(hir_id, target, ProcMacroKind::FunctionLike)
|
self.check_proc_macro(hir_id, target, ProcMacroKind::FunctionLike)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user