Don't record trait aliases as marker traits

This commit is contained in:
Michael Goulet 2024-07-25 00:32:50 -04:00
parent 2ccafed862
commit 12f1463b7e
4 changed files with 27 additions and 8 deletions

View File

@ -1207,25 +1207,29 @@ fn adt_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::AdtDef<'_> {
fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef { fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
let item = tcx.hir().expect_item(def_id); let item = tcx.hir().expect_item(def_id);
let (is_auto, safety, items) = match item.kind { let (is_alias, is_auto, safety, items) = match item.kind {
hir::ItemKind::Trait(is_auto, safety, .., items) => { hir::ItemKind::Trait(is_auto, safety, .., items) => {
(is_auto == hir::IsAuto::Yes, safety, items) (false, is_auto == hir::IsAuto::Yes, safety, items)
} }
hir::ItemKind::TraitAlias(..) => (false, hir::Safety::Safe, &[][..]), hir::ItemKind::TraitAlias(..) => (true, false, hir::Safety::Safe, &[][..]),
_ => span_bug!(item.span, "trait_def_of_item invoked on non-trait"), _ => span_bug!(item.span, "trait_def_of_item invoked on non-trait"),
}; };
let constness = if tcx.has_attr(def_id, sym::const_trait) { // Only regular traits can be const.
let constness = if !is_alias && tcx.has_attr(def_id, sym::const_trait) {
hir::Constness::Const hir::Constness::Const
} else { } else {
hir::Constness::NotConst hir::Constness::NotConst
}; };
let paren_sugar = tcx.has_attr(def_id, sym::rustc_paren_sugar); let paren_sugar = tcx.has_attr(def_id, sym::rustc_paren_sugar);
if paren_sugar && !tcx.features().unboxed_closures { if paren_sugar && !tcx.features().unboxed_closures {
tcx.dcx().emit_err(errors::ParenSugarAttribute { span: item.span }); tcx.dcx().emit_err(errors::ParenSugarAttribute { span: item.span });
} }
let is_marker = tcx.has_attr(def_id, sym::marker); // Only regular traits can be marker.
let is_marker = !is_alias && tcx.has_attr(def_id, sym::marker);
let rustc_coinductive = tcx.has_attr(def_id, sym::rustc_coinductive); let rustc_coinductive = tcx.has_attr(def_id, sym::rustc_coinductive);
let is_fundamental = tcx.has_attr(def_id, sym::fundamental); let is_fundamental = tcx.has_attr(def_id, sym::fundamental);

View File

@ -1,3 +0,0 @@
//@ known-bug: rust-lang/rust#127222
#[marker]
trait Foo = PartialEq<i32> + Send;

View File

@ -0,0 +1,7 @@
#![feature(trait_alias, marker_trait_attr)]
#[marker]
//~^ ERROR attribute should be applied to a trait
trait Foo = Send;
fn main() {}

View File

@ -0,0 +1,11 @@
error: attribute should be applied to a trait
--> $DIR/not-a-marker.rs:3:1
|
LL | #[marker]
| ^^^^^^^^^
LL |
LL | trait Foo = Send;
| ----------------- not a trait
error: aborting due to 1 previous error