Port #[rustc_specialization_trait] to the new attribute system
This commit is contained in:
@@ -343,6 +343,9 @@ pub enum AttributeKind {
|
||||
/// Represents `#[rustc_skip_during_method_dispatch]`.
|
||||
SkipDuringMethodDispatch { array: bool, boxed_slice: bool, span: Span },
|
||||
|
||||
/// Represents `#[rustc_specialization_trait]`.
|
||||
SpecializationTrait(Span),
|
||||
|
||||
/// Represents `#[stable]`, `#[unstable]` and `#[rustc_allowed_through_unstable_modules]`.
|
||||
Stability {
|
||||
stability: Stability,
|
||||
|
||||
@@ -55,6 +55,7 @@ impl AttributeKind {
|
||||
RustcLayoutScalarValidRangeStart(..) => Yes,
|
||||
RustcObjectLifetimeDefault => No,
|
||||
SkipDuringMethodDispatch { .. } => No,
|
||||
SpecializationTrait(..) => No,
|
||||
Stability { .. } => Yes,
|
||||
StdInternalSymbol(..) => No,
|
||||
TargetFeature(..) => No,
|
||||
|
||||
@@ -89,3 +89,10 @@ impl<S: Stage> NoArgsAttributeParser<S> for TypeConstParser {
|
||||
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
|
||||
const CREATE: fn(Span) -> AttributeKind = AttributeKind::TypeConst;
|
||||
}
|
||||
|
||||
pub(crate) struct SpecializationTraitParser;
|
||||
impl<S: Stage> NoArgsAttributeParser<S> for SpecializationTraitParser {
|
||||
const PATH: &[Symbol] = &[sym::rustc_specialization_trait];
|
||||
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
|
||||
const CREATE: fn(Span) -> AttributeKind = AttributeKind::SpecializationTrait;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ use crate::attributes::stability::{
|
||||
use crate::attributes::test_attrs::IgnoreParser;
|
||||
use crate::attributes::traits::{
|
||||
CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser,
|
||||
SkipDuringMethodDispatchParser, TypeConstParser,
|
||||
SkipDuringMethodDispatchParser, SpecializationTraitParser, TypeConstParser,
|
||||
};
|
||||
use crate::attributes::transparency::TransparencyParser;
|
||||
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
|
||||
@@ -167,6 +167,7 @@ attribute_parsers!(
|
||||
Single<WithoutArgs<NonExhaustiveParser>>,
|
||||
Single<WithoutArgs<PassByValueParser>>,
|
||||
Single<WithoutArgs<PubTransparentParser>>,
|
||||
Single<WithoutArgs<SpecializationTraitParser>>,
|
||||
Single<WithoutArgs<StdInternalSymbolParser>>,
|
||||
Single<WithoutArgs<TrackCallerParser>>,
|
||||
Single<WithoutArgs<TypeConstParser>>,
|
||||
|
||||
@@ -880,7 +880,7 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
|
||||
let specialization_kind =
|
||||
if attrs.iter().any(|attr| attr.has_name(sym::rustc_unsafe_specialization_marker)) {
|
||||
ty::trait_def::TraitSpecializationKind::Marker
|
||||
} else if attrs.iter().any(|attr| attr.has_name(sym::rustc_specialization_trait)) {
|
||||
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
|
||||
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
|
||||
} else {
|
||||
ty::trait_def::TraitSpecializationKind::None
|
||||
|
||||
@@ -287,6 +287,7 @@ pub fn check_builtin_meta_item(
|
||||
| sym::rustc_do_not_implement_via_object
|
||||
| sym::rustc_coinductive
|
||||
| sym::const_trait
|
||||
| sym::rustc_specialization_trait
|
||||
| sym::type_const
|
||||
| sym::repr
|
||||
| sym::align
|
||||
|
||||
@@ -125,7 +125,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
||||
| AttributeKind::Coinductive(attr_span)
|
||||
| AttributeKind::ConstTrait(attr_span)
|
||||
| AttributeKind::DenyExplicitImpl(attr_span)
|
||||
| AttributeKind::DoNotImplementViaObject(attr_span),
|
||||
| AttributeKind::DoNotImplementViaObject(attr_span)
|
||||
| AttributeKind::SpecializationTrait(attr_span),
|
||||
) => {
|
||||
self.check_must_be_applied_to_trait(*attr_span, span, target);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user