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]`. /// Represents `#[rustc_skip_during_method_dispatch]`.
SkipDuringMethodDispatch { array: bool, boxed_slice: bool, span: Span }, SkipDuringMethodDispatch { array: bool, boxed_slice: bool, span: Span },
/// Represents `#[rustc_specialization_trait]`.
SpecializationTrait(Span),
/// Represents `#[stable]`, `#[unstable]` and `#[rustc_allowed_through_unstable_modules]`. /// Represents `#[stable]`, `#[unstable]` and `#[rustc_allowed_through_unstable_modules]`.
Stability { Stability {
stability: Stability, stability: Stability,

View File

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

View File

@@ -89,3 +89,10 @@ impl<S: Stage> NoArgsAttributeParser<S> for TypeConstParser {
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error; const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
const CREATE: fn(Span) -> AttributeKind = AttributeKind::TypeConst; 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::test_attrs::IgnoreParser;
use crate::attributes::traits::{ use crate::attributes::traits::{
CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser, CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser,
SkipDuringMethodDispatchParser, TypeConstParser, SkipDuringMethodDispatchParser, SpecializationTraitParser, TypeConstParser,
}; };
use crate::attributes::transparency::TransparencyParser; use crate::attributes::transparency::TransparencyParser;
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs}; use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
@@ -167,6 +167,7 @@ attribute_parsers!(
Single<WithoutArgs<NonExhaustiveParser>>, Single<WithoutArgs<NonExhaustiveParser>>,
Single<WithoutArgs<PassByValueParser>>, Single<WithoutArgs<PassByValueParser>>,
Single<WithoutArgs<PubTransparentParser>>, Single<WithoutArgs<PubTransparentParser>>,
Single<WithoutArgs<SpecializationTraitParser>>,
Single<WithoutArgs<StdInternalSymbolParser>>, Single<WithoutArgs<StdInternalSymbolParser>>,
Single<WithoutArgs<TrackCallerParser>>, Single<WithoutArgs<TrackCallerParser>>,
Single<WithoutArgs<TypeConstParser>>, Single<WithoutArgs<TypeConstParser>>,

View File

@@ -880,7 +880,7 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
let specialization_kind = let specialization_kind =
if attrs.iter().any(|attr| attr.has_name(sym::rustc_unsafe_specialization_marker)) { if attrs.iter().any(|attr| attr.has_name(sym::rustc_unsafe_specialization_marker)) {
ty::trait_def::TraitSpecializationKind::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 ty::trait_def::TraitSpecializationKind::AlwaysApplicable
} else { } else {
ty::trait_def::TraitSpecializationKind::None 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_do_not_implement_via_object
| sym::rustc_coinductive | sym::rustc_coinductive
| sym::const_trait | sym::const_trait
| sym::rustc_specialization_trait
| sym::type_const | sym::type_const
| sym::repr | sym::repr
| sym::align | sym::align

View File

@@ -125,7 +125,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
| AttributeKind::Coinductive(attr_span) | AttributeKind::Coinductive(attr_span)
| AttributeKind::ConstTrait(attr_span) | AttributeKind::ConstTrait(attr_span)
| AttributeKind::DenyExplicitImpl(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); self.check_must_be_applied_to_trait(*attr_span, span, target);
} }