Skip to content

Commit e365405

Browse files
committed
Port #[const_trait] to the new attribute system
1 parent 35453a8 commit e365405

File tree

8 files changed

+49
-33
lines changed

8 files changed

+49
-33
lines changed

compiler/rustc_attr_data_structures/src/attributes.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ pub enum AttributeKind {
236236
/// Represents `#[rustc_const_stable_indirect]`.
237237
ConstStabilityIndirect,
238238

239+
/// Represents `#[const_trait]`.
240+
ConstTrait(Span),
241+
239242
/// Represents [`#[deprecated]`](https://doc.rust-lang.org/stable/reference/attributes/diagnostics.html#the-deprecated-attribute).
240243
Deprecation { deprecation: Deprecation, span: Span },
241244

compiler/rustc_attr_data_structures/src/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ impl AttributeKind {
2323
ConstContinue(..) => No,
2424
ConstStability { .. } => Yes,
2525
ConstStabilityIndirect => No,
26+
ConstTrait(..) => No,
2627
Deprecation { .. } => Yes,
2728
DocComment { .. } => Yes,
2829
ExportName { .. } => Yes,

compiler/rustc_attr_parsing/src/attributes/traits.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ use core::mem;
22

33
use rustc_attr_data_structures::AttributeKind;
44
use rustc_feature::{AttributeTemplate, template};
5-
use rustc_span::{Symbol, sym};
5+
use rustc_span::{Span, Symbol, sym};
66

7-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
7+
use crate::attributes::{
8+
AttributeOrder, NoArgsAttributeParser, OnDuplicate, SingleAttributeParser,
9+
};
810
use crate::context::{AcceptContext, Stage};
911
use crate::parser::ArgParser;
1012

@@ -52,3 +54,10 @@ impl<S: Stage> SingleAttributeParser<S> for SkipDuringMethodDispatchParser {
5254
Some(AttributeKind::SkipDuringMethodDispatch { array, boxed_slice, span: cx.attr_span })
5355
}
5456
}
57+
58+
pub(crate) struct ConstTraitParser;
59+
impl<S: Stage> NoArgsAttributeParser<S> for ConstTraitParser {
60+
const PATH: &[Symbol] = &[sym::const_trait];
61+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
62+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::ConstTrait;
63+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use crate::attributes::semantics::MayDangleParser;
3535
use crate::attributes::stability::{
3636
BodyStabilityParser, ConstStabilityIndirectParser, ConstStabilityParser, StabilityParser,
3737
};
38-
use crate::attributes::traits::SkipDuringMethodDispatchParser;
38+
use crate::attributes::traits::{ConstTraitParser, SkipDuringMethodDispatchParser};
3939
use crate::attributes::transparency::TransparencyParser;
4040
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
4141
use crate::parser::{ArgParser, MetaItemParser, PathParser};
@@ -139,6 +139,7 @@ attribute_parsers!(
139139
Single<WithoutArgs<ColdParser>>,
140140
Single<WithoutArgs<ConstContinueParser>>,
141141
Single<WithoutArgs<ConstStabilityIndirectParser>>,
142+
Single<WithoutArgs<ConstTraitParser>>,
142143
Single<WithoutArgs<LoopMatchParser>>,
143144
Single<WithoutArgs<MayDangleParser>>,
144145
Single<WithoutArgs<NoMangleParser>>,

compiler/rustc_hir_analysis/src/collect.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -855,39 +855,42 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
855855
_ => span_bug!(item.span, "trait_def_of_item invoked on non-trait"),
856856
};
857857

858+
let attrs = tcx.get_all_attrs(def_id);
858859
// Only regular traits can be const.
859-
let constness = if !is_alias && tcx.has_attr(def_id, sym::const_trait) {
860+
let constness = if !is_alias && find_attr!(attrs, AttributeKind::ConstTrait(_)) {
860861
hir::Constness::Const
861862
} else {
862863
hir::Constness::NotConst
863864
};
864865

865-
let paren_sugar = tcx.has_attr(def_id, sym::rustc_paren_sugar);
866+
let paren_sugar = attrs.iter().any(|attr| attr.has_name(sym::rustc_paren_sugar));
866867
if paren_sugar && !tcx.features().unboxed_closures() {
867868
tcx.dcx().emit_err(errors::ParenSugarAttribute { span: item.span });
868869
}
869870

870871
// Only regular traits can be marker.
871-
let is_marker = !is_alias && tcx.has_attr(def_id, sym::marker);
872+
let is_marker = !is_alias && attrs.iter().any(|attr| attr.has_name(sym::marker));
872873

873-
let rustc_coinductive = tcx.has_attr(def_id, sym::rustc_coinductive);
874-
let is_fundamental = tcx.has_attr(def_id, sym::fundamental);
874+
let rustc_coinductive = attrs.iter().any(|attr| attr.has_name(sym::rustc_coinductive));
875+
let is_fundamental = attrs.iter().any(|attr| attr.has_name(sym::fundamental));
875876

876877
let [skip_array_during_method_dispatch, skip_boxed_slice_during_method_dispatch] = find_attr!(
877-
tcx.get_all_attrs(def_id),
878-
AttributeKind::SkipDuringMethodDispatch { array, boxed_slice, span:_ } => [*array, *boxed_slice]
878+
attrs,
879+
AttributeKind::SkipDuringMethodDispatch { array, boxed_slice, span: _ } => [*array, *boxed_slice]
879880
)
880881
.unwrap_or([false; 2]);
881882

882-
let specialization_kind = if tcx.has_attr(def_id, sym::rustc_unsafe_specialization_marker) {
883-
ty::trait_def::TraitSpecializationKind::Marker
884-
} else if tcx.has_attr(def_id, sym::rustc_specialization_trait) {
885-
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
886-
} else {
887-
ty::trait_def::TraitSpecializationKind::None
888-
};
889-
let must_implement_one_of = tcx
890-
.get_attr(def_id, sym::rustc_must_implement_one_of)
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 attrs.iter().any(|attr| attr.has_name(sym::rustc_specialization_trait)) {
887+
ty::trait_def::TraitSpecializationKind::AlwaysApplicable
888+
} else {
889+
ty::trait_def::TraitSpecializationKind::None
890+
};
891+
let must_implement_one_of = attrs
892+
.iter()
893+
.find(|attr| attr.has_name(sym::rustc_must_implement_one_of))
891894
// Check that there are at least 2 arguments of `#[rustc_must_implement_one_of]`
892895
// and that they are all identifiers
893896
.and_then(|attr| match attr.meta_item_list() {
@@ -961,8 +964,9 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
961964
no_dups.then_some(list)
962965
});
963966

964-
let deny_explicit_impl = tcx.has_attr(def_id, sym::rustc_deny_explicit_impl);
965-
let implement_via_object = !tcx.has_attr(def_id, sym::rustc_do_not_implement_via_object);
967+
let deny_explicit_impl = attrs.iter().any(|attr| attr.has_name(sym::rustc_deny_explicit_impl));
968+
let implement_via_object =
969+
!attrs.iter().any(|attr| attr.has_name(sym::rustc_do_not_implement_via_object));
966970

967971
ty::TraitDef {
968972
def_id: def_id.to_def_id(),

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,21 +1781,18 @@ impl<'tcx> TyCtxt<'tcx> {
17811781
did: impl Into<DefId>,
17821782
attr: Symbol,
17831783
) -> impl Iterator<Item = &'tcx hir::Attribute> {
1784-
self.get_all_attrs(did).filter(move |a: &&hir::Attribute| a.has_name(attr))
1784+
self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
17851785
}
17861786

17871787
/// Gets all attributes.
17881788
///
17891789
/// To see if an item has a specific attribute, you should use [`rustc_attr_data_structures::find_attr!`] so you can use matching.
1790-
pub fn get_all_attrs(
1791-
self,
1792-
did: impl Into<DefId>,
1793-
) -> impl Iterator<Item = &'tcx hir::Attribute> {
1790+
pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
17941791
let did: DefId = did.into();
17951792
if let Some(did) = did.as_local() {
1796-
self.hir_attrs(self.local_def_id_to_hir_id(did)).iter()
1793+
self.hir_attrs(self.local_def_id_to_hir_id(did))
17971794
} else {
1798-
self.attrs_for_def(did).iter()
1795+
self.attrs_for_def(did)
17991796
}
18001797
}
18011798

compiler/rustc_parse/src/validate_attr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ fn emit_malformed_attribute(
293293
| sym::rustc_force_inline
294294
| sym::rustc_confusables
295295
| sym::rustc_skip_during_method_dispatch
296+
| sym::const_trait
296297
| sym::repr
297298
| sym::align
298299
| sym::deprecated

compiler/rustc_passes/src/check_attr.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
120120
for attr in attrs {
121121
let mut style = None;
122122
match attr {
123-
Attribute::Parsed(AttributeKind::SkipDuringMethodDispatch {
124-
span: attr_span,
125-
..
126-
}) => {
123+
Attribute::Parsed(
124+
AttributeKind::SkipDuringMethodDispatch { span: attr_span, .. }
125+
| AttributeKind::ConstTrait(attr_span),
126+
) => {
127127
self.check_must_be_applied_to_trait(*attr_span, span, target);
128128
}
129129
Attribute::Parsed(AttributeKind::Confusables { first_span, .. }) => {
@@ -272,7 +272,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
272272
| [sym::rustc_must_implement_one_of, ..]
273273
| [sym::rustc_deny_explicit_impl, ..]
274274
| [sym::rustc_do_not_implement_via_object, ..]
275-
| [sym::const_trait, ..] => self.check_must_be_applied_to_trait(attr.span(), span, target),
275+
=> self.check_must_be_applied_to_trait(attr.span(), span, target),
276276
[sym::collapse_debuginfo, ..] => self.check_collapse_debuginfo(attr, span, target),
277277
[sym::must_not_suspend, ..] => self.check_must_not_suspend(attr, span, target),
278278
[sym::rustc_pass_by_value, ..] => self.check_pass_by_value(attr, span, target),

0 commit comments

Comments
 (0)