Skip to content

Commit fccdb6a

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

File tree

6 files changed

+31
-10
lines changed

6 files changed

+31
-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
@@ -298,5 +298,8 @@ pub enum AttributeKind {
298298

299299
/// Represents `#[type_const]`.
300300
TypeConst(Span),
301+
302+
/// Represents `#[rustc_unsafe_specialization_marker]`.
303+
UnsafeSpecializationMarker(Span),
301304
// tidy-alphabetical-end
302305
}

compiler/rustc_attr_parsing/src/attributes/traits.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,13 @@ impl<S: Stage> NoArgsAttributeParser<S> for SpecializationTraitParser {
114114
AttributeKind::SpecializationTrait(span)
115115
}
116116
}
117+
118+
pub(crate) struct UnsafeSpecializationMarkerParser;
119+
impl<S: Stage> NoArgsAttributeParser<S> for UnsafeSpecializationMarkerParser {
120+
const PATH: &[Symbol] = &[sym::rustc_unsafe_specialization_marker];
121+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
122+
123+
fn create(span: Span) -> AttributeKind {
124+
AttributeKind::UnsafeSpecializationMarker(span)
125+
}
126+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use crate::attributes::stability::{
3030
use crate::attributes::traits::{
3131
CoinductiveParser, ConstTraitParser, DenyExplicitImplParser, DoNotImplementViaObjectParser,
3232
SkipDuringMethodDispatchParser, SpecializationTraitParser, TypeConstParser,
33+
UnsafeSpecializationMarkerParser,
3334
};
3435
use crate::attributes::transparency::TransparencyParser;
3536
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
@@ -138,6 +139,7 @@ attribute_parsers!(
138139
Single<WithoutArgs<PubTransparentParser>>,
139140
Single<WithoutArgs<SpecializationTraitParser>>,
140141
Single<WithoutArgs<TypeConstParser>>,
142+
Single<WithoutArgs<UnsafeSpecializationMarkerParser>>,
141143
// tidy-alphabetical-end
142144
];
143145
);

compiler/rustc_hir_analysis/src/collect.rs

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

1162-
let specialization_kind =
1163-
if attrs.iter().any(|attr| attr.has_name(sym::rustc_unsafe_specialization_marker)) {
1164-
ty::trait_def::TraitSpecializationKind::Marker
1165-
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
1166-
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
1167-
} else {
1168-
ty::trait_def::TraitSpecializationKind::None
1169-
};
1162+
let specialization_kind = if find_attr!(attrs, AttributeKind::UnsafeSpecializationMarker(_)) {
1163+
ty::trait_def::TraitSpecializationKind::Marker
1164+
} else if find_attr!(attrs, AttributeKind::SpecializationTrait(_)) {
1165+
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
1166+
} else {
1167+
ty::trait_def::TraitSpecializationKind::None
1168+
};
11701169
let must_implement_one_of = attrs
11711170
.iter()
11721171
.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
@@ -301,6 +301,7 @@ fn emit_malformed_attribute(
301301
| sym::rustc_coinductive
302302
| sym::const_trait
303303
| sym::rustc_specialization_trait
304+
| sym::rustc_unsafe_specialization_marker
304305
| sym::type_const
305306
| sym::rustc_pass_by_value
306307
| sym::repr

compiler/rustc_passes/src/check_attr.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,17 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
123123
| AttributeKind::Coinductive(attr_span)
124124
| AttributeKind::ConstTrait(attr_span)
125125
| AttributeKind::DenyExplicitImpl(attr_span)
126-
| AttributeKind::DoNotImplementViaObject(attr_span)
127-
| AttributeKind::SpecializationTrait(attr_span),
126+
| AttributeKind::DoNotImplementViaObject(attr_span),
128127
) => {
129128
self.check_must_be_applied_to_trait(*attr_span, span, target);
130129
}
130+
&Attribute::Parsed(
131+
AttributeKind::SpecializationTrait(attr_span)
132+
| AttributeKind::UnsafeSpecializationMarker(attr_span),
133+
) => {
134+
// FIXME(specialization): more validation is needed
135+
self.check_must_be_applied_to_trait(attr_span, span, target);
136+
}
131137
&Attribute::Parsed(AttributeKind::TypeConst(attr_span)) => {
132138
self.check_type_const(hir_id, attr_span, target)
133139
}

0 commit comments

Comments
 (0)