From c8619647359903a707891e7d40f68264d1e6ed94 Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Sat, 21 Aug 2021 14:19:59 -0700 Subject: [PATCH] Note that trait aliases cannot be recursive --- compiler/rustc_query_impl/src/keys.rs | 4 +++ compiler/rustc_query_system/src/query/job.rs | 25 ++++++++++++------- .../infinite-trait-alias-recursion.stderr | 1 + 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/compiler/rustc_query_impl/src/keys.rs b/compiler/rustc_query_impl/src/keys.rs index 40b820c8d8e..88ab7597eac 100644 --- a/compiler/rustc_query_impl/src/keys.rs +++ b/compiler/rustc_query_impl/src/keys.rs @@ -178,6 +178,10 @@ impl Key for (DefId, Option) { fn default_span(&self, tcx: TyCtxt<'_>) -> Span { tcx.def_span(self.0) } + #[inline(always)] + fn key_as_def_id(&self) -> Option { + Some(self.0) + } } impl Key for (DefId, LocalDefId, Ident) { diff --git a/compiler/rustc_query_system/src/query/job.rs b/compiler/rustc_query_system/src/query/job.rs index f8ba0babab0..63a8f062475 100644 --- a/compiler/rustc_query_system/src/query/job.rs +++ b/compiler/rustc_query_system/src/query/job.rs @@ -600,16 +600,23 @@ pub(crate) fn report_cycle<'a>( )); } - if !stack.is_empty() - && stack.iter().all(|entry| { - entry.query.def_kind.map_or(false, |def_kind| { - matches!(def_kind, SimpleDefKind::TyAlias | SimpleDefKind::TraitAlias) - }) + if stack.iter().all(|entry| { + entry.query.def_kind.map_or(false, |def_kind| { + matches!(def_kind, SimpleDefKind::TyAlias | SimpleDefKind::TraitAlias) }) - { - err.note("type aliases cannot be recursive"); - err.help("consider using a struct, enum, or union instead to break the cycle"); - err.help("see for more information"); + }) { + if stack.iter().all(|entry| { + entry + .query + .def_kind + .map_or(false, |def_kind| matches!(def_kind, SimpleDefKind::TyAlias)) + }) { + err.note("type aliases cannot be recursive"); + err.help("consider using a struct, enum, or union instead to break the cycle"); + err.help("see for more information"); + } else { + err.note("trait aliases cannot be recursive"); + } } if let Some((span, query)) = usage { diff --git a/src/test/ui/infinite/infinite-trait-alias-recursion.stderr b/src/test/ui/infinite/infinite-trait-alias-recursion.stderr index c8e67740d79..5ecaedb3cb2 100644 --- a/src/test/ui/infinite/infinite-trait-alias-recursion.stderr +++ b/src/test/ui/infinite/infinite-trait-alias-recursion.stderr @@ -30,6 +30,7 @@ note: ...which requires computing the super traits of `T3`... LL | trait T3 = T1 + T3; | ^^ = note: ...which again requires computing the super predicates of `T1`, completing the cycle + = note: trait aliases cannot be recursive note: cycle used when collecting item types in top-level module --> $DIR/infinite-trait-alias-recursion.rs:3:1 |