Don't record trait aliases as marker traits
This commit is contained in:
parent
2ccafed862
commit
12f1463b7e
@ -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);
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
//@ known-bug: rust-lang/rust#127222
|
|
||||||
#[marker]
|
|
||||||
trait Foo = PartialEq<i32> + Send;
|
|
7
tests/ui/traits/alias/not-a-marker.rs
Normal file
7
tests/ui/traits/alias/not-a-marker.rs
Normal 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() {}
|
11
tests/ui/traits/alias/not-a-marker.stderr
Normal file
11
tests/ui/traits/alias/not-a-marker.stderr
Normal 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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user