Skip to content

Commit ddb9890

Browse files
committed
Port #[rustc_unsafe_specialization_marker] to the new attribute system
1 parent 35c4d03 commit ddb9890

File tree

7 files changed

+29
-10
lines changed

7 files changed

+29
-10
lines changed

compiler/rustc_attr_data_structures/src/attributes.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,9 @@ pub enum AttributeKind {
342342
/// Represents `#[type_const]`.
343343
TypeConst(Span),
344344

345+
/// Represents `#[rustc_unsafe_specialization_marker]`.
346+
UnsafeSpecializationMarker(Span),
347+
345348
/// Represents `#[used]`
346349
Used { used_by: UsedBy, span: Span },
347350
// tidy-alphabetical-end

compiler/rustc_attr_data_structures/src/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ impl AttributeKind {
5454
TargetFeature(..) => No,
5555
TrackCaller(..) => Yes,
5656
TypeConst(..) => Yes,
57+
UnsafeSpecializationMarker(..) => No,
5758
Used { .. } => No,
5859
// tidy-alphabetical-end
5960
}

compiler/rustc_attr_parsing/src/attributes/traits.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,10 @@ impl<S: Stage> NoArgsAttributeParser<S> for SpecializationTraitParser {
9696
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
9797
const CREATE: fn(Span) -> AttributeKind = AttributeKind::SpecializationTrait;
9898
}
99+
100+
pub(crate) struct UnsafeSpecializationMarkerParser;
101+
impl<S: Stage> NoArgsAttributeParser<S> for UnsafeSpecializationMarkerParser {
102+
const PATH: &[Symbol] = &[sym::rustc_unsafe_specialization_marker];
103+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
104+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::UnsafeSpecializationMarker;
105+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use crate::attributes::stability::{
4040
use crate::attributes::traits::{
4141
CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser,
4242
SkipDuringMethodDispatchParser, SpecializationTraitParser, TypeConstParser,
43+
UnsafeSpecializationMarkerParser,
4344
};
4445
use crate::attributes::transparency::TransparencyParser;
4546
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
@@ -158,6 +159,7 @@ attribute_parsers!(
158159
Single<WithoutArgs<SpecializationTraitParser>>,
159160
Single<WithoutArgs<TrackCallerParser>>,
160161
Single<WithoutArgs<TypeConstParser>>,
162+
Single<WithoutArgs<UnsafeSpecializationMarkerParser>>,
161163
// tidy-alphabetical-end
162164
];
163165
);

compiler/rustc_hir_analysis/src/collect.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -877,14 +877,13 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
877877
)
878878
.unwrap_or([false; 2]);
879879

880-
let specialization_kind =
881-
if attrs.iter().any(|attr| attr.has_name(sym::rustc_unsafe_specialization_marker)) {
882-
ty::trait_def::TraitSpecializationKind::Marker
883-
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
884-
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
885-
} else {
886-
ty::trait_def::TraitSpecializationKind::None
887-
};
880+
let specialization_kind = if find_attr!(attrs, AttributeKind::UnsafeSpecializationMarker(_)) {
881+
ty::trait_def::TraitSpecializationKind::Marker
882+
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
883+
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
884+
} else {
885+
ty::trait_def::TraitSpecializationKind::None
886+
};
888887
let must_implement_one_of = attrs
889888
.iter()
890889
.find(|attr| attr.has_name(sym::rustc_must_implement_one_of))

compiler/rustc_parse/src/validate_attr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ fn emit_malformed_attribute(
299299
| sym::rustc_coinductive
300300
| sym::const_trait
301301
| sym::rustc_specialization_trait
302+
| sym::rustc_unsafe_specialization_marker
302303
| sym::type_const
303304
| sym::repr
304305
| sym::align

compiler/rustc_passes/src/check_attr.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,17 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
125125
| AttributeKind::Coinductive(attr_span)
126126
| AttributeKind::ConstTrait(attr_span)
127127
| AttributeKind::DenyExplicitImpl(attr_span)
128-
| AttributeKind::DoNotImplementViaObject(attr_span)
129-
| AttributeKind::SpecializationTrait(attr_span),
128+
| AttributeKind::DoNotImplementViaObject(attr_span),
130129
) => {
131130
self.check_must_be_applied_to_trait(*attr_span, span, target);
132131
}
132+
&Attribute::Parsed(
133+
AttributeKind::SpecializationTrait(attr_span)
134+
| AttributeKind::UnsafeSpecializationMarker(attr_span),
135+
) => {
136+
// FIXME(specialization): more validation is needed
137+
self.check_must_be_applied_to_trait(attr_span, span, target);
138+
}
133139
&Attribute::Parsed(AttributeKind::TypeConst(attr_span)) => {
134140
self.check_type_const(hir_id, attr_span, target)
135141
}

0 commit comments

Comments
 (0)