about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-04-18 01:04:04 +0000
committerbors <bors@rust-lang.org>2018-04-18 01:04:04 +0000
commitb91e6a2672a6f69e404d87fa62a5900a390622cf (patch)
treec7f8cf90c2a889261ac5cf8c63f6fa5125ae46ac /src
parent9a59133c09980122ce026d20e7832d63b106a927 (diff)
parent9cbe3b749dfb39fde5992081e18114700ed5bd80 (diff)
downloadrust-b91e6a2672a6f69e404d87fa62a5900a390622cf.tar.gz
rust-b91e6a2672a6f69e404d87fa62a5900a390622cf.zip
Auto merge of #49950 - Zoxc:default-span, r=estebank
Improve query cycle error message

r? @michaelwoerister
Diffstat (limited to 'src')
-rw-r--r--src/librustc/ty/maps/job.rs14
-rw-r--r--src/librustc/ty/maps/plumbing.rs79
-rw-r--r--src/test/compile-fail/coherence-inherited-assoc-ty-cycle-err.rs2
-rw-r--r--src/test/compile-fail/const-size_of-cycle.rs2
-rw-r--r--src/test/compile-fail/cycle-projection-based-on-where-clause.rs2
-rw-r--r--src/test/compile-fail/cycle-trait-default-type-trait.rs2
-rw-r--r--src/test/compile-fail/cycle-trait-supertrait-direct.rs2
-rw-r--r--src/test/compile-fail/infinite-vec-type-recursion.rs2
-rw-r--r--src/test/compile-fail/issue-20772.rs2
-rw-r--r--src/test/compile-fail/issue-20825.rs2
-rw-r--r--src/test/compile-fail/issue-21177.rs2
-rw-r--r--src/test/compile-fail/issue-22673.rs2
-rw-r--r--src/test/compile-fail/issue-26548.rs8
-rw-r--r--src/test/compile-fail/issue-34373.rs4
-rw-r--r--src/test/compile-fail/issue-44415.rs3
-rw-r--r--src/test/compile-fail/resolve-self-in-impl.rs10
-rw-r--r--src/test/ui/cycle-trait-supertrait-indirect.rs3
-rw-r--r--src/test/ui/cycle-trait-supertrait-indirect.stderr22
-rw-r--r--src/test/ui/impl-trait/auto-trait-leak.rs3
-rw-r--r--src/test/ui/impl-trait/auto-trait-leak.stderr22
-rw-r--r--src/test/ui/issue-12511.rs3
-rw-r--r--src/test/ui/issue-12511.stderr17
-rw-r--r--src/test/ui/issue-23302-1.stderr17
-rw-r--r--src/test/ui/issue-23302-2.stderr17
-rw-r--r--src/test/ui/issue-23302-3.rs4
-rw-r--r--src/test/ui/issue-23302-3.stderr29
-rw-r--r--src/test/ui/issue-36163.stderr21
-rw-r--r--src/test/ui/resolve/issue-23305.rs2
-rw-r--r--src/test/ui/resolve/issue-23305.stderr11
29 files changed, 138 insertions, 171 deletions
diff --git a/src/librustc/ty/maps/job.rs b/src/librustc/ty/maps/job.rs
index 7d756fb16a4..374406158c1 100644
--- a/src/librustc/ty/maps/job.rs
+++ b/src/librustc/ty/maps/job.rs
@@ -31,6 +31,7 @@ pub(super) enum QueryResult<'tcx, T> {
 /// A span and a query key
 #[derive(Clone, Debug)]
 pub struct QueryInfo<'tcx> {
+    /// The span for a reason this query was required
     pub span: Span,
     pub query: Query<'tcx>,
 }
@@ -73,13 +74,22 @@ impl<'tcx> QueryJob<'tcx> {
             cycle.insert(0, job.info.clone());
 
             if &*job as *const _ == self as *const _ {
-                break;
+                // This is the end of the cycle
+                // The span entry we included was for the usage
+                // of the cycle itself, and not part of the cycle
+                // Replace it with the span which caused the cycle to form
+                cycle[0].span = span;
+                // Find out why the cycle itself was used
+                let usage = job.parent.as_ref().map(|parent| {
+                    (job.info.span, parent.info.query.clone())
+                });
+                return Err(CycleError { usage, cycle });
             }
 
             current_job = job.parent.clone();
         }
 
-        Err(CycleError { span, cycle })
+        panic!("did not find a cycle")
     }
 
     /// Signals to waiters that the query is complete.
diff --git a/src/librustc/ty/maps/plumbing.rs b/src/librustc/ty/maps/plumbing.rs
index 185db623c6f..4f6925938c8 100644
--- a/src/librustc/ty/maps/plumbing.rs
+++ b/src/librustc/ty/maps/plumbing.rs
@@ -17,6 +17,7 @@ use errors::DiagnosticBuilder;
 use errors::Level;
 use ty::tls;
 use ty::{TyCtxt};
+use ty::maps::Query;
 use ty::maps::config::QueryDescription;
 use ty::maps::job::{QueryResult, QueryInfo};
 use ty::item_path;
@@ -63,7 +64,8 @@ pub(super) trait GetCacheInternal<'tcx>: QueryDescription<'tcx> + Sized {
 
 #[derive(Clone)]
 pub(super) struct CycleError<'tcx> {
-    pub(super) span: Span,
+    /// The query and related span which uses the cycle
+    pub(super) usage: Option<(Span, Query<'tcx>)>,
     pub(super) cycle: Vec<QueryInfo<'tcx>>,
 }
 
@@ -79,33 +81,41 @@ pub(super) enum TryGetLock<'a, 'tcx: 'a, T, D: QueryDescription<'tcx> + 'a> {
 }
 
 impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
-    pub(super) fn report_cycle(self, CycleError { span, cycle: stack }: CycleError)
+    pub(super) fn report_cycle(self, CycleError { usage, cycle: stack }: CycleError<'gcx>)
         -> DiagnosticBuilder<'a>
     {
         assert!(!stack.is_empty());
 
+        let fix_span = |span: Span, query: &Query<'gcx>| {
+            self.sess.codemap().def_span(query.default_span(self, span))
+        };
+
         // Disable naming impls with types in this path, since that
         // sometimes cycles itself, leading to extra cycle errors.
         // (And cycle errors around impls tend to occur during the
         // collect/coherence phases anyhow.)
         item_path::with_forced_impl_filename_line(|| {
-            let span = self.sess.codemap().def_span(span);
-            let mut err =
-                struct_span_err!(self.sess, span, E0391,
-                                 "cyclic dependency detected");
-            err.span_label(span, "cyclic reference");
-
-            err.span_note(self.sess.codemap().def_span(stack[0].span),
-                          &format!("the cycle begins when {}...", stack[0].query.describe(self)));
-
-            for &QueryInfo { span, ref query, .. } in &stack[1..] {
-                err.span_note(self.sess.codemap().def_span(span),
-                              &format!("...which then requires {}...", query.describe(self)));
+            let span = fix_span(stack[1 % stack.len()].span, &stack[0].query);
+            let mut err = struct_span_err!(self.sess,
+                                           span,
+                                           E0391,
+                                           "cycle detected when {}",
+                                           stack[0].query.describe(self));
+
+            for i in 1..stack.len() {
+                let query = &stack[i].query;
+                let span = fix_span(stack[(i + 1) % stack.len()].span, query);
+                err.span_note(span, &format!("...which requires {}...", query.describe(self)));
             }
 
-            err.note(&format!("...which then again requires {}, completing the cycle.",
+            err.note(&format!("...which again requires {}, completing the cycle",
                               stack[0].query.describe(self)));
 
+            if let Some((span, query)) = usage {
+                err.span_note(fix_span(span, &query),
+                              &format!("cycle used when {}", query.describe(self)));
+            }
+
             return err
         })
     }
@@ -266,6 +276,22 @@ macro_rules! define_maps {
                     r
                 }
             }
+
+            // FIXME(eddyb) Get more valid Span's on queries.
+            pub fn default_span(&self, tcx: TyCtxt<'_, $tcx, '_>, span: Span) -> Span {
+                if span != DUMMY_SP {
+                    return span;
+                }
+                // The def_span query is used to calculate default_span,
+                // so exit to avoid infinite recursion
+                match *self {
+                    Query::def_span(..) => return span,
+                    _ => ()
+                }
+                match *self {
+                    $(Query::$name(key) => key.default_span(tcx),)*
+                }
+            }
         }
 
         pub mod queries {
@@ -303,7 +329,7 @@ macro_rules! define_maps {
             /// If the query already executed and panicked, this will fatal error / silently panic
             fn try_get_lock(
                 tcx: TyCtxt<'a, $tcx, 'lcx>,
-                mut span: Span,
+                span: Span,
                 key: &$K
             ) -> TryGetLock<'a, $tcx, $V, Self>
             {
@@ -329,13 +355,6 @@ macro_rules! define_maps {
                     };
                     mem::drop(lock);
 
-                    // This just matches the behavior of `try_get_with` so the span when
-                    // we await matches the span we would use when executing.
-                    // See the FIXME there.
-                    if span == DUMMY_SP && stringify!($name) != "def_span" {
-                        span = key.default_span(tcx);
-                    }
-
                     if let Err(cycle) = job.await(tcx, span) {
                         return TryGetLock::JobCompleted(Err(cycle));
                     }
@@ -343,7 +362,7 @@ macro_rules! define_maps {
             }
 
             fn try_get_with(tcx: TyCtxt<'a, $tcx, 'lcx>,
-                            mut span: Span,
+                            span: Span,
                             key: $K)
                             -> Result<$V, CycleError<$tcx>>
             {
@@ -377,18 +396,6 @@ macro_rules! define_maps {
 
                 let mut lock = get_lock_or_return!();
 
-                // FIXME(eddyb) Get more valid Span's on queries.
-                // def_span guard is necessary to prevent a recursive loop,
-                // default_span calls def_span query internally.
-                if span == DUMMY_SP && stringify!($name) != "def_span" {
-                    // This might deadlock if we hold the map lock since we might be
-                    // waiting for the def_span query and switch to some other fiber
-                    // So we drop the lock here and reacquire it
-                    mem::drop(lock);
-                    span = key.default_span(tcx);
-                    lock = get_lock_or_return!();
-                }
-
                 // Fast path for when incr. comp. is off. `to_dep_node` is
                 // expensive for some DepKinds.
                 if !tcx.dep_graph.is_fully_enabled() {
diff --git a/src/test/compile-fail/coherence-inherited-assoc-ty-cycle-err.rs b/src/test/compile-fail/coherence-inherited-assoc-ty-cycle-err.rs
index 2f4d82e2ef5..5db901b5ba1 100644
--- a/src/test/compile-fail/coherence-inherited-assoc-ty-cycle-err.rs
+++ b/src/test/compile-fail/coherence-inherited-assoc-ty-cycle-err.rs
@@ -17,7 +17,7 @@
 #![feature(specialization)]
 
 trait Trait<T> { type Assoc; }
-//~^ cyclic dependency detected [E0391]
+//~^ cycle detected
 
 impl<T> Trait<T> for Vec<T> {
     type Assoc = ();
diff --git a/src/test/compile-fail/const-size_of-cycle.rs b/src/test/compile-fail/const-size_of-cycle.rs
index 6218dcbf5f2..fed8e1885de 100644
--- a/src/test/compile-fail/const-size_of-cycle.rs
+++ b/src/test/compile-fail/const-size_of-cycle.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// error-pattern: cyclic dependency detected
+// error-pattern: cycle detected
 
 #![feature(const_fn)]
 
diff --git a/src/test/compile-fail/cycle-projection-based-on-where-clause.rs b/src/test/compile-fail/cycle-projection-based-on-where-clause.rs
index ee4722c010f..56ad1771e00 100644
--- a/src/test/compile-fail/cycle-projection-based-on-where-clause.rs
+++ b/src/test/compile-fail/cycle-projection-based-on-where-clause.rs
@@ -25,7 +25,7 @@ trait Trait { type Item; }
 struct A<T>
     where T : Trait,
           T : Add<T::Item>
-    //~^ ERROR cyclic dependency detected
+    //~^ ERROR cycle detected
     //~| ERROR associated type `Item` not found for `T`
 {
     data: T
diff --git a/src/test/compile-fail/cycle-trait-default-type-trait.rs b/src/test/compile-fail/cycle-trait-default-type-trait.rs
index 88672088bcb..b8bae215456 100644
--- a/src/test/compile-fail/cycle-trait-default-type-trait.rs
+++ b/src/test/compile-fail/cycle-trait-default-type-trait.rs
@@ -12,7 +12,7 @@
 // again references the trait.
 
 trait Foo<X = Box<Foo>> {
-    //~^ ERROR cyclic dependency detected
+    //~^ ERROR cycle detected
 }
 
 fn main() { }
diff --git a/src/test/compile-fail/cycle-trait-supertrait-direct.rs b/src/test/compile-fail/cycle-trait-supertrait-direct.rs
index 626567ccc0e..b802463fcb0 100644
--- a/src/test/compile-fail/cycle-trait-supertrait-direct.rs
+++ b/src/test/compile-fail/cycle-trait-supertrait-direct.rs
@@ -11,7 +11,7 @@
 // Test a supertrait cycle where a trait extends itself.
 
 trait Chromosome: Chromosome {
-    //~^ ERROR cyclic dependency detected
+    //~^ ERROR cycle detected
 }
 
 fn main() { }
diff --git a/src/test/compile-fail/infinite-vec-type-recursion.rs b/src/test/compile-fail/infinite-vec-type-recursion.rs
index 25d0590db1b..42c80b54313 100644
--- a/src/test/compile-fail/infinite-vec-type-recursion.rs
+++ b/src/test/compile-fail/infinite-vec-type-recursion.rs
@@ -9,6 +9,6 @@
 // except according to those terms.
 
 type x = Vec<x>;
-//~^ ERROR cyclic dependency detected
+//~^ ERROR cycle detected
 
 fn main() { let b: x = Vec::new(); }
diff --git a/src/test/compile-fail/issue-20772.rs b/src/test/compile-fail/issue-20772.rs
index 88395e5f1ea..d67c76a1525 100644
--- a/src/test/compile-fail/issue-20772.rs
+++ b/src/test/compile-fail/issue-20772.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 trait T : Iterator<Item=Self::Item>
-//~^ ERROR cyclic dependency detected
+//~^ ERROR cycle detected
 //~| ERROR associated type `Item` not found for `Self`
 {}
 
diff --git a/src/test/compile-fail/issue-20825.rs b/src/test/compile-fail/issue-20825.rs
index aeb798b3828..cbb987cd512 100644
--- a/src/test/compile-fail/issue-20825.rs
+++ b/src/test/compile-fail/issue-20825.rs
@@ -13,7 +13,7 @@ pub trait Subscriber {
 }
 
 pub trait Processor: Subscriber<Input = Self::Input> {
-    //~^ ERROR cyclic dependency detected [E0391]
+    //~^ ERROR cycle detected
     type Input;
 }
 
diff --git a/src/test/compile-fail/issue-21177.rs b/src/test/compile-fail/issue-21177.rs
index 40c95b98f12..9da57877a09 100644
--- a/src/test/compile-fail/issue-21177.rs
+++ b/src/test/compile-fail/issue-21177.rs
@@ -14,7 +14,7 @@ trait Trait {
 }
 
 fn foo<T: Trait<A = T::B>>() { }
-//~^ ERROR cyclic dependency detected
+//~^ ERROR cycle detected
 //~| ERROR associated type `B` not found for `T`
 
 fn main() { }
diff --git a/src/test/compile-fail/issue-22673.rs b/src/test/compile-fail/issue-22673.rs
index fde2d001542..2396007c3df 100644
--- a/src/test/compile-fail/issue-22673.rs
+++ b/src/test/compile-fail/issue-22673.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 trait Expr : PartialEq<Self::Item> {
-    //~^ ERROR: cyclic dependency detected
+    //~^ ERROR: cycle detected
     type Item;
 }
 
diff --git a/src/test/compile-fail/issue-26548.rs b/src/test/compile-fail/issue-26548.rs
index 16a650cc6d8..aab674fbb1a 100644
--- a/src/test/compile-fail/issue-26548.rs
+++ b/src/test/compile-fail/issue-26548.rs
@@ -8,11 +8,9 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// error-pattern: cyclic dependency detected
-// note-pattern: the cycle begins when computing layout of
-// note-pattern: ...which then requires computing layout of
-// note-pattern: ...which then again requires computing layout of
-
+// error-pattern: cycle detected when computing layout of
+// note-pattern: ...which requires computing layout of
+// note-pattern: ...which again requires computing layout of
 
 trait Mirror { type It: ?Sized; }
 impl<T: ?Sized> Mirror for T { type It = Self; }
diff --git a/src/test/compile-fail/issue-34373.rs b/src/test/compile-fail/issue-34373.rs
index b18e05af47c..4d7238ad76f 100644
--- a/src/test/compile-fail/issue-34373.rs
+++ b/src/test/compile-fail/issue-34373.rs
@@ -14,8 +14,8 @@ trait Trait<T> {
     fn foo(_: T) {}
 }
 
-pub struct Foo<T = Box<Trait<DefaultFoo>>>;
-type DefaultFoo = Foo; //~ ERROR cyclic dependency detected
+pub struct Foo<T = Box<Trait<DefaultFoo>>>;  //~ ERROR cycle detected
+type DefaultFoo = Foo;
 
 fn main() {
 }
diff --git a/src/test/compile-fail/issue-44415.rs b/src/test/compile-fail/issue-44415.rs
index 930a427e9a5..ecaf326b050 100644
--- a/src/test/compile-fail/issue-44415.rs
+++ b/src/test/compile-fail/issue-44415.rs
@@ -8,6 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// error-pattern: cycle detected when computing layout of
+
 #![feature(const_fn)]
 #![feature(core_intrinsics)]
 
@@ -15,7 +17,6 @@ use std::intrinsics;
 
 struct Foo {
     bytes: [u8; unsafe { intrinsics::size_of::<Foo>() }],
-    //~^ ERROR cyclic dependency detected
     x: usize,
 }
 
diff --git a/src/test/compile-fail/resolve-self-in-impl.rs b/src/test/compile-fail/resolve-self-in-impl.rs
index 7210c857125..2a894c57b8d 100644
--- a/src/test/compile-fail/resolve-self-in-impl.rs
+++ b/src/test/compile-fail/resolve-self-in-impl.rs
@@ -21,10 +21,10 @@ impl Tr for S where Self: Copy {} // OK
 impl Tr for S where S<Self>: Copy {} // OK
 impl Tr for S where Self::A: Copy {} // OK
 
-impl Tr for Self {} //~ ERROR cyclic dependency detected
-impl Tr for S<Self> {} //~ ERROR cyclic dependency detected
-impl Self {} //~ ERROR cyclic dependency detected
-impl S<Self> {} //~ ERROR cyclic dependency detected
-impl Tr<Self::A> for S {} //~ ERROR cyclic dependency detected
+impl Tr for Self {} //~ ERROR cycle detected
+impl Tr for S<Self> {} //~ ERROR cycle detected
+impl Self {} //~ ERROR cycle detected
+impl S<Self> {} //~ ERROR cycle detected
+impl Tr<Self::A> for S {} //~ ERROR cycle detected
 
 fn main() {}
diff --git a/src/test/ui/cycle-trait-supertrait-indirect.rs b/src/test/ui/cycle-trait-supertrait-indirect.rs
index 447505e886f..f240a34817d 100644
--- a/src/test/ui/cycle-trait-supertrait-indirect.rs
+++ b/src/test/ui/cycle-trait-supertrait-indirect.rs
@@ -15,10 +15,9 @@ trait A: B {
 }
 
 trait B: C {
+    //~^ ERROR cycle detected
 }
 
 trait C: B { }
-    //~^ ERROR cyclic dependency detected
-    //~| cyclic reference
 
 fn main() { }
diff --git a/src/test/ui/cycle-trait-supertrait-indirect.stderr b/src/test/ui/cycle-trait-supertrait-indirect.stderr
index 68c20df5f72..85681b478e2 100644
--- a/src/test/ui/cycle-trait-supertrait-indirect.stderr
+++ b/src/test/ui/cycle-trait-supertrait-indirect.stderr
@@ -1,20 +1,20 @@
-error[E0391]: cyclic dependency detected
-  --> $DIR/cycle-trait-supertrait-indirect.rs:20:1
+error[E0391]: cycle detected when computing the supertraits of `B`
+  --> $DIR/cycle-trait-supertrait-indirect.rs:17:1
    |
-LL | trait C: B { }
-   | ^^^^^^^^^^ cyclic reference
+LL | trait B: C {
+   | ^^^^^^^^^^
    |
-note: the cycle begins when computing the supertraits of `B`...
-  --> $DIR/cycle-trait-supertrait-indirect.rs:14:1
+note: ...which requires computing the supertraits of `C`...
+  --> $DIR/cycle-trait-supertrait-indirect.rs:21:1
    |
-LL | trait A: B {
+LL | trait C: B { }
    | ^^^^^^^^^^
-note: ...which then requires computing the supertraits of `C`...
-  --> $DIR/cycle-trait-supertrait-indirect.rs:17:1
+   = note: ...which again requires computing the supertraits of `B`, completing the cycle
+note: cycle used when computing the supertraits of `A`
+  --> $DIR/cycle-trait-supertrait-indirect.rs:14:1
    |
-LL | trait B: C {
+LL | trait A: B {
    | ^^^^^^^^^^
-   = note: ...which then again requires computing the supertraits of `B`, completing the cycle.
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/impl-trait/auto-trait-leak.rs b/src/test/ui/impl-trait/auto-trait-leak.rs
index 99a7dd5e785..54d54875764 100644
--- a/src/test/ui/impl-trait/auto-trait-leak.rs
+++ b/src/test/ui/impl-trait/auto-trait-leak.rs
@@ -40,8 +40,7 @@ fn after() -> impl Fn(i32) {
 // independently resolved and only require the concrete
 // return type, which can't depend on the obligation.
 fn cycle1() -> impl Clone {
-    //~^ ERROR cyclic dependency detected
-    //~| cyclic reference
+    //~^ ERROR cycle detected
     send(cycle2().clone());
 
     Rc::new(Cell::new(5))
diff --git a/src/test/ui/impl-trait/auto-trait-leak.stderr b/src/test/ui/impl-trait/auto-trait-leak.stderr
index ca639f1076d..3b20451b102 100644
--- a/src/test/ui/impl-trait/auto-trait-leak.stderr
+++ b/src/test/ui/impl-trait/auto-trait-leak.stderr
@@ -28,33 +28,29 @@ note: required by `send`
 LL | fn send<T: Send>(_: T) {}
    | ^^^^^^^^^^^^^^^^^^^^^^
 
-error[E0391]: cyclic dependency detected
-  --> $DIR/auto-trait-leak.rs:42:1
-   |
-LL | fn cycle1() -> impl Clone {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^ cyclic reference
-   |
-note: the cycle begins when processing `cycle1`...
+error[E0391]: cycle detected when processing `cycle1`
   --> $DIR/auto-trait-leak.rs:42:1
    |
 LL | fn cycle1() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which then requires processing `cycle2::{{impl-Trait}}`...
-  --> $DIR/auto-trait-leak.rs:50:16
+   |
+note: ...which requires processing `cycle2::{{impl-Trait}}`...
+  --> $DIR/auto-trait-leak.rs:49:16
    |
 LL | fn cycle2() -> impl Clone {
    |                ^^^^^^^^^^
-note: ...which then requires processing `cycle2`...
-  --> $DIR/auto-trait-leak.rs:50:1
+note: ...which requires processing `cycle2`...
+  --> $DIR/auto-trait-leak.rs:49:1
    |
 LL | fn cycle2() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which then requires processing `cycle1::{{impl-Trait}}`...
+note: ...which requires processing `cycle1::{{impl-Trait}}`...
   --> $DIR/auto-trait-leak.rs:42:16
    |
 LL | fn cycle1() -> impl Clone {
    |                ^^^^^^^^^^
-   = note: ...which then again requires processing `cycle1`, completing the cycle.
+   = note: ...which again requires processing `cycle1`, completing the cycle
+note: cycle used when type-checking all item bodies
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/issue-12511.rs b/src/test/ui/issue-12511.rs
index e4d60768687..83359bf1675 100644
--- a/src/test/ui/issue-12511.rs
+++ b/src/test/ui/issue-12511.rs
@@ -9,11 +9,10 @@
 // except according to those terms.
 
 trait t1 : t2 {
+//~^ ERROR cycle detected
 }
 
 trait t2 : t1 {
-//~^ ERROR cyclic dependency detected
-//~| cyclic reference
 }
 
 fn main() { }
diff --git a/src/test/ui/issue-12511.stderr b/src/test/ui/issue-12511.stderr
index c1612b8cb67..1a48e6a6de1 100644
--- a/src/test/ui/issue-12511.stderr
+++ b/src/test/ui/issue-12511.stderr
@@ -1,20 +1,15 @@
-error[E0391]: cyclic dependency detected
-  --> $DIR/issue-12511.rs:14:1
-   |
-LL | trait t2 : t1 {
-   | ^^^^^^^^^^^^^ cyclic reference
-   |
-note: the cycle begins when computing the supertraits of `t1`...
+error[E0391]: cycle detected when computing the supertraits of `t1`
   --> $DIR/issue-12511.rs:11:1
    |
 LL | trait t1 : t2 {
    | ^^^^^^^^^^^^^
-note: ...which then requires computing the supertraits of `t2`...
-  --> $DIR/issue-12511.rs:11:1
    |
-LL | trait t1 : t2 {
+note: ...which requires computing the supertraits of `t2`...
+  --> $DIR/issue-12511.rs:15:1
+   |
+LL | trait t2 : t1 {
    | ^^^^^^^^^^^^^
-   = note: ...which then again requires computing the supertraits of `t1`, completing the cycle.
+   = note: ...which again requires computing the supertraits of `t1`, completing the cycle
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issue-23302-1.stderr b/src/test/ui/issue-23302-1.stderr
index c587c00279b..0fbe2f7a411 100644
--- a/src/test/ui/issue-23302-1.stderr
+++ b/src/test/ui/issue-23302-1.stderr
@@ -1,20 +1,11 @@
-error[E0391]: cyclic dependency detected
-  --> $DIR/issue-23302-1.rs:14:9
-   |
-LL |     A = X::A as isize, //~ ERROR E0391
-   |         ^^^^^^^^^^^^^ cyclic reference
-   |
-note: the cycle begins when const-evaluating `X::A::{{initializer}}`...
-  --> $DIR/issue-23302-1.rs:14:9
-   |
-LL |     A = X::A as isize, //~ ERROR E0391
-   |         ^^^^^^^^^^^^^
-note: ...which then requires computing layout of `X`...
+error[E0391]: cycle detected when const-evaluating `X::A::{{initializer}}`
   --> $DIR/issue-23302-1.rs:14:9
    |
 LL |     A = X::A as isize, //~ ERROR E0391
    |         ^^^^
-   = note: ...which then again requires const-evaluating `X::A::{{initializer}}`, completing the cycle.
+   |
+note: ...which requires computing layout of `X`...
+   = note: ...which again requires const-evaluating `X::A::{{initializer}}`, completing the cycle
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issue-23302-2.stderr b/src/test/ui/issue-23302-2.stderr
index 553ddaa1a81..313cfa0c162 100644
--- a/src/test/ui/issue-23302-2.stderr
+++ b/src/test/ui/issue-23302-2.stderr
@@ -1,20 +1,11 @@
-error[E0391]: cyclic dependency detected
-  --> $DIR/issue-23302-2.rs:14:9
-   |
-LL |     A = Y::B as isize, //~ ERROR E0391
-   |         ^^^^^^^^^^^^^ cyclic reference
-   |
-note: the cycle begins when const-evaluating `Y::A::{{initializer}}`...
-  --> $DIR/issue-23302-2.rs:14:9
-   |
-LL |     A = Y::B as isize, //~ ERROR E0391
-   |         ^^^^^^^^^^^^^
-note: ...which then requires computing layout of `Y`...
+error[E0391]: cycle detected when const-evaluating `Y::A::{{initializer}}`
   --> $DIR/issue-23302-2.rs:14:9
    |
 LL |     A = Y::B as isize, //~ ERROR E0391
    |         ^^^^
-   = note: ...which then again requires const-evaluating `Y::A::{{initializer}}`, completing the cycle.
+   |
+note: ...which requires computing layout of `Y`...
+   = note: ...which again requires const-evaluating `Y::A::{{initializer}}`, completing the cycle
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issue-23302-3.rs b/src/test/ui/issue-23302-3.rs
index 5903acc8b7a..c3664e0abe1 100644
--- a/src/test/ui/issue-23302-3.rs
+++ b/src/test/ui/issue-23302-3.rs
@@ -8,8 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-const A: i32 = B;
+const A: i32 = B; //~ ERROR cycle detected
 
-const B: i32 = A; //~ ERROR cyclic dependency detected
+const B: i32 = A;
 
 fn main() { }
diff --git a/src/test/ui/issue-23302-3.stderr b/src/test/ui/issue-23302-3.stderr
index 8cf296bc6db..54edf42679a 100644
--- a/src/test/ui/issue-23302-3.stderr
+++ b/src/test/ui/issue-23302-3.stderr
@@ -1,30 +1,25 @@
-error[E0391]: cyclic dependency detected
-  --> $DIR/issue-23302-3.rs:13:16
-   |
-LL | const B: i32 = A; //~ ERROR cyclic dependency detected
-   |                ^ cyclic reference
-   |
-note: the cycle begins when const checking if rvalue is promotable to static `A`...
+error[E0391]: cycle detected when const checking if rvalue is promotable to static `A`
   --> $DIR/issue-23302-3.rs:11:1
    |
-LL | const A: i32 = B;
+LL | const A: i32 = B; //~ ERROR cycle detected
    | ^^^^^^^^^^^^^^^^^
-note: ...which then requires checking which parts of `A` are promotable to static...
-  --> $DIR/issue-23302-3.rs:11:1
    |
-LL | const A: i32 = B;
-   | ^^^^^^^^^^^^^^^^^
-note: ...which then requires const checking if rvalue is promotable to static `B`...
+note: ...which requires checking which parts of `A` are promotable to static...
   --> $DIR/issue-23302-3.rs:11:16
    |
-LL | const A: i32 = B;
+LL | const A: i32 = B; //~ ERROR cycle detected
    |                ^
-note: ...which then requires checking which parts of `B` are promotable to static...
+note: ...which requires const checking if rvalue is promotable to static `B`...
   --> $DIR/issue-23302-3.rs:13:1
    |
-LL | const B: i32 = A; //~ ERROR cyclic dependency detected
+LL | const B: i32 = A;
    | ^^^^^^^^^^^^^^^^^
-   = note: ...which then again requires const checking if rvalue is promotable to static `A`, completing the cycle.
+note: ...which requires checking which parts of `B` are promotable to static...
+  --> $DIR/issue-23302-3.rs:13:16
+   |
+LL | const B: i32 = A;
+   |                ^
+   = note: ...which again requires const checking if rvalue is promotable to static `A`, completing the cycle
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issue-36163.stderr b/src/test/ui/issue-36163.stderr
index 7ab4bd46ebf..541f54ca768 100644
--- a/src/test/ui/issue-36163.stderr
+++ b/src/test/ui/issue-36163.stderr
@@ -1,30 +1,21 @@
-error[E0391]: cyclic dependency detected
-  --> $DIR/issue-36163.rs:14:9
-   |
-LL |     B = A, //~ ERROR E0391
-   |         ^ cyclic reference
-   |
-note: the cycle begins when const-evaluating `Foo::B::{{initializer}}`...
+error[E0391]: cycle detected when const-evaluating `Foo::B::{{initializer}}`
   --> $DIR/issue-36163.rs:14:9
    |
 LL |     B = A, //~ ERROR E0391
    |         ^
-note: ...which then requires processing `Foo::B::{{initializer}}`...
+   |
+note: ...which requires processing `Foo::B::{{initializer}}`...
   --> $DIR/issue-36163.rs:14:9
    |
 LL |     B = A, //~ ERROR E0391
    |         ^
-note: ...which then requires const-evaluating `A`...
-  --> $DIR/issue-36163.rs:11:1
-   |
-LL | const A: isize = Foo::B as isize;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which then requires computing layout of `Foo`...
+note: ...which requires const-evaluating `A`...
   --> $DIR/issue-36163.rs:11:18
    |
 LL | const A: isize = Foo::B as isize;
    |                  ^^^^^^
-   = note: ...which then again requires const-evaluating `Foo::B::{{initializer}}`, completing the cycle.
+note: ...which requires computing layout of `Foo`...
+   = note: ...which again requires const-evaluating `Foo::B::{{initializer}}`, completing the cycle
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/resolve/issue-23305.rs b/src/test/ui/resolve/issue-23305.rs
index 34f8a0a4843..5ae4ce1f7ee 100644
--- a/src/test/ui/resolve/issue-23305.rs
+++ b/src/test/ui/resolve/issue-23305.rs
@@ -13,6 +13,6 @@ pub trait ToNbt<T> {
 }
 
 impl ToNbt<Self> {}
-//~^ ERROR cyclic dependency detected
+//~^ ERROR cycle detected
 
 fn main() {}
diff --git a/src/test/ui/resolve/issue-23305.stderr b/src/test/ui/resolve/issue-23305.stderr
index 63b7ab78b13..d25a072fe0a 100644
--- a/src/test/ui/resolve/issue-23305.stderr
+++ b/src/test/ui/resolve/issue-23305.stderr
@@ -1,15 +1,10 @@
-error[E0391]: cyclic dependency detected
+error[E0391]: cycle detected when processing `<impl at $DIR/issue-23305.rs:15:1: 15:20>`
   --> $DIR/issue-23305.rs:15:12
    |
 LL | impl ToNbt<Self> {}
-   |            ^^^^ cyclic reference
+   |            ^^^^
    |
-note: the cycle begins when processing `<impl at $DIR/issue-23305.rs:15:1: 15:20>`...
-  --> $DIR/issue-23305.rs:15:1
-   |
-LL | impl ToNbt<Self> {}
-   | ^^^^^^^^^^^^^^^^
-   = note: ...which then again requires processing `<impl at $DIR/issue-23305.rs:15:1: 15:20>`, completing the cycle.
+   = note: ...which again requires processing `<impl at $DIR/issue-23305.rs:15:1: 15:20>`, completing the cycle
 
 error: aborting due to previous error