Port #[rustc_specialization_trait] to the new attribute system

This commit is contained in:
Pavel Grigorenko
2025-06-24 01:29:44 +03:00
parent 813ec60744
commit 6193783961
7 changed files with 17 additions and 3 deletions

View File

@@ -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,

View File

@@ -55,6 +55,7 @@ impl AttributeKind {
RustcLayoutScalarValidRangeStart(..) => Yes,
RustcObjectLifetimeDefault => No,
SkipDuringMethodDispatch { .. } => No,
SpecializationTrait(..) => No,
Stability { .. } => Yes,
StdInternalSymbol(..) => No,
TargetFeature(..) => No,

View File

@@ -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;
}

View File

@@ -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>>,

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}