Skip to content

Commit a57a885

Browse files
committed
Port #[rustc_unsafe_specialization_marker] to the new attribute system
1 parent 6193783 commit a57a885

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
@@ -365,6 +365,9 @@ pub enum AttributeKind {
365365
/// Represents `#[type_const]`.
366366
TypeConst(Span),
367367

368+
/// Represents `#[rustc_unsafe_specialization_marker]`.
369+
UnsafeSpecializationMarker(Span),
370+
368371
/// Represents `#[used]`
369372
Used { used_by: UsedBy, span: Span },
370373
// 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
@@ -61,6 +61,7 @@ impl AttributeKind {
6161
TargetFeature(..) => No,
6262
TrackCaller(..) => Yes,
6363
TypeConst(..) => Yes,
64+
UnsafeSpecializationMarker(..) => No,
6465
Used { .. } => No,
6566
// tidy-alphabetical-end
6667
}

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
@@ -46,6 +46,7 @@ use crate::attributes::test_attrs::IgnoreParser;
4646
use crate::attributes::traits::{
4747
CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser,
4848
SkipDuringMethodDispatchParser, SpecializationTraitParser, TypeConstParser,
49+
UnsafeSpecializationMarkerParser,
4950
};
5051
use crate::attributes::transparency::TransparencyParser;
5152
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
@@ -171,6 +172,7 @@ attribute_parsers!(
171172
Single<WithoutArgs<StdInternalSymbolParser>>,
172173
Single<WithoutArgs<TrackCallerParser>>,
173174
Single<WithoutArgs<TypeConstParser>>,
175+
Single<WithoutArgs<UnsafeSpecializationMarkerParser>>,
174176
// tidy-alphabetical-end
175177
];
176178
);

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
@@ -288,6 +288,7 @@ pub fn check_builtin_meta_item(
288288
| sym::rustc_coinductive
289289
| sym::const_trait
290290
| sym::rustc_specialization_trait
291+
| sym::rustc_unsafe_specialization_marker
291292
| sym::type_const
292293
| sym::repr
293294
| 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)