Skip to content

Commit a9ef0ba

Browse files
committed
Port #[rustc_unsafe_specialization_marker] to the new attribute system
1 parent 2662a2d commit a9ef0ba

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
@@ -333,6 +333,9 @@ pub enum AttributeKind {
333333
/// Represents `#[type_const]`.
334334
TypeConst(Span),
335335

336+
/// Represents `#[rustc_unsafe_specialization_marker]`.
337+
UnsafeSpecializationMarker(Span),
338+
336339
/// Represents `#[used]`
337340
Used { used_by: UsedBy, span: Span },
338341
// 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
@@ -51,6 +51,7 @@ impl AttributeKind {
5151
TargetFeature(..) => No,
5252
TrackCaller(..) => Yes,
5353
TypeConst(..) => Yes,
54+
UnsafeSpecializationMarker(..) => No,
5455
Used { .. } => No,
5556
// tidy-alphabetical-end
5657
}

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
@@ -38,6 +38,7 @@ use crate::attributes::stability::{
3838
use crate::attributes::traits::{
3939
CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser,
4040
SkipDuringMethodDispatchParser, SpecializationTraitParser, TypeConstParser,
41+
UnsafeSpecializationMarkerParser,
4142
};
4243
use crate::attributes::transparency::TransparencyParser;
4344
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
@@ -153,6 +154,7 @@ attribute_parsers!(
153154
Single<WithoutArgs<SpecializationTraitParser>>,
154155
Single<WithoutArgs<TrackCallerParser>>,
155156
Single<WithoutArgs<TypeConstParser>>,
157+
Single<WithoutArgs<UnsafeSpecializationMarkerParser>>,
156158
// tidy-alphabetical-end
157159
];
158160
);

compiler/rustc_hir_analysis/src/collect.rs

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

883-
let specialization_kind =
884-
if attrs.iter().any(|attr| attr.has_name(sym::rustc_unsafe_specialization_marker)) {
885-
ty::trait_def::TraitSpecializationKind::Marker
886-
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
887-
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
888-
} else {
889-
ty::trait_def::TraitSpecializationKind::None
890-
};
883+
let specialization_kind = if find_attr!(attrs, AttributeKind::UnsafeSpecializationMarker(_)) {
884+
ty::trait_def::TraitSpecializationKind::Marker
885+
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
886+
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
887+
} else {
888+
ty::trait_def::TraitSpecializationKind::None
889+
};
891890
let must_implement_one_of = attrs
892891
.iter()
893892
.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
@@ -298,6 +298,7 @@ fn emit_malformed_attribute(
298298
| sym::rustc_coinductive
299299
| sym::const_trait
300300
| sym::rustc_specialization_trait
301+
| sym::rustc_unsafe_specialization_marker
301302
| sym::type_const
302303
| sym::repr
303304
| 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)