From 21f6e55ce99d59733cc49977a1a416882da1c808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Fri, 13 Apr 2018 19:22:22 +0200 Subject: [PATCH 1/3] Call default_span lazily when query cycles occur instead of in the hot path for queries --- src/librustc/ty/maps/plumbing.rs | 53 +++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/librustc/ty/maps/plumbing.rs b/src/librustc/ty/maps/plumbing.rs index efe7a56d80097..1475c36977aac 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,6 +64,7 @@ pub(super) trait GetCacheInternal<'tcx>: QueryDescription<'tcx> + Sized { #[derive(Clone)] pub(super) struct CycleError<'tcx> { + /// The span of the reason the first query in `cycle` ran the last query in `cycle` pub(super) span: Span, pub(super) cycle: Vec>, } @@ -79,27 +81,31 @@ 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 { span, 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 span = fix_span(span, &stack.first().unwrap().query); 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), + err.span_note(fix_span(stack[0].span, &stack[0].query), &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), + err.span_note(fix_span(span, query), &format!("...which then requires {}...", query.describe(self))); } @@ -266,6 +272,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 +325,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 +351,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 +358,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 +392,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() { From 5841c687a39f7aed99cde543e60199b4dabff76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Fri, 13 Apr 2018 22:20:10 +0200 Subject: [PATCH 2/3] Improve query cycle error message --- src/librustc/ty/maps/job.rs | 14 +++++++++++-- src/librustc/ty/maps/plumbing.rs | 36 ++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/librustc/ty/maps/job.rs b/src/librustc/ty/maps/job.rs index 7d756fb16a453..374406158c1d5 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 1475c36977aac..003fe71b946f5 100644 --- a/src/librustc/ty/maps/plumbing.rs +++ b/src/librustc/ty/maps/plumbing.rs @@ -64,8 +64,8 @@ pub(super) trait GetCacheInternal<'tcx>: QueryDescription<'tcx> + Sized { #[derive(Clone)] pub(super) struct CycleError<'tcx> { - /// The span of the reason the first query in `cycle` ran the last query in `cycle` - pub(super) span: Span, + /// The query and related span which uses the cycle + pub(super) usage: Option<(Span, Query<'tcx>)>, pub(super) cycle: Vec>, } @@ -81,7 +81,7 @@ 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<'gcx>) + pub(super) fn report_cycle(self, CycleError { usage, cycle: stack }: CycleError<'gcx>) -> DiagnosticBuilder<'a> { assert!(!stack.is_empty()); @@ -95,23 +95,27 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { // (And cycle errors around impls tend to occur during the // collect/coherence phases anyhow.) item_path::with_forced_impl_filename_line(|| { - let span = fix_span(span, &stack.first().unwrap().query); - let mut err = - struct_span_err!(self.sess, span, E0391, - "cyclic dependency detected"); - err.span_label(span, "cyclic reference"); - - err.span_note(fix_span(stack[0].span, &stack[0].query), - &format!("the cycle begins when {}...", stack[0].query.describe(self))); - - for &QueryInfo { span, ref query, .. } in &stack[1..] { - err.span_note(fix_span(span, query), - &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 }) } From 9cbe3b749dfb39fde5992081e18114700ed5bd80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Sun, 15 Apr 2018 23:21:00 +0200 Subject: [PATCH 3/3] Update tests --- .../coherence-inherited-assoc-ty-cycle-err.rs | 2 +- src/test/compile-fail/const-size_of-cycle.rs | 2 +- .../cycle-projection-based-on-where-clause.rs | 2 +- .../cycle-trait-default-type-trait.rs | 2 +- .../cycle-trait-supertrait-direct.rs | 2 +- .../infinite-vec-type-recursion.rs | 2 +- src/test/compile-fail/issue-20772.rs | 2 +- src/test/compile-fail/issue-20825.rs | 2 +- src/test/compile-fail/issue-21177.rs | 2 +- src/test/compile-fail/issue-22673.rs | 2 +- src/test/compile-fail/issue-26548.rs | 8 ++--- src/test/compile-fail/issue-34373.rs | 4 +-- src/test/compile-fail/issue-44415.rs | 3 +- src/test/compile-fail/resolve-self-in-impl.rs | 10 +++---- .../ui/cycle-trait-supertrait-indirect.rs | 3 +- .../ui/cycle-trait-supertrait-indirect.stderr | 22 +++++++------- src/test/ui/impl-trait/auto-trait-leak.rs | 3 +- src/test/ui/impl-trait/auto-trait-leak.stderr | 22 ++++++-------- src/test/ui/issue-12511.rs | 3 +- src/test/ui/issue-12511.stderr | 17 ++++------- src/test/ui/issue-23302-1.stderr | 17 +++-------- src/test/ui/issue-23302-2.stderr | 17 +++-------- src/test/ui/issue-23302-3.rs | 4 +-- src/test/ui/issue-23302-3.stderr | 29 ++++++++----------- src/test/ui/issue-36163.stderr | 21 ++++---------- src/test/ui/resolve/issue-23305.rs | 2 +- src/test/ui/resolve/issue-23305.stderr | 11 ++----- 27 files changed, 83 insertions(+), 133 deletions(-) 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 2f4d82e2ef514..5db901b5ba1c2 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 { type Assoc; } -//~^ cyclic dependency detected [E0391] +//~^ cycle detected impl Trait for Vec { 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 6218dcbf5f2c5..fed8e1885de8a 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 ee4722c010f16..56ad1771e00bd 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 where T : Trait, T : Add - //~^ 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 88672088bcb4c..b8bae2154566e 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> { - //~^ 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 626567ccc0ead..b802463fcb036 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 25d0590db1b75..42c80b54313d0 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; -//~^ 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 88395e5f1eafa..d67c76a1525d5 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 -//~^ 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 aeb798b382875..cbb987cd512af 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 { - //~^ 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 40c95b98f1264..9da57877a09dc 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>() { } -//~^ 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 fde2d001542b8..2396007c3df3e 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 { - //~^ 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 16a650cc6d886..aab674fbb1a44 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 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 b18e05af47c97..4d7238ad76f75 100644 --- a/src/test/compile-fail/issue-34373.rs +++ b/src/test/compile-fail/issue-34373.rs @@ -14,8 +14,8 @@ trait Trait { fn foo(_: T) {} } -pub struct Foo>>; -type DefaultFoo = Foo; //~ ERROR cyclic dependency detected +pub struct Foo>>; //~ 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 930a427e9a5e0..ecaf326b0504d 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::() }], - //~^ 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 7210c857125d6..2a894c57b8df1 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: Copy {} // OK impl Tr for S where Self::A: Copy {} // OK -impl Tr for Self {} //~ ERROR cyclic dependency detected -impl Tr for S {} //~ ERROR cyclic dependency detected -impl Self {} //~ ERROR cyclic dependency detected -impl S {} //~ ERROR cyclic dependency detected -impl Tr for S {} //~ ERROR cyclic dependency detected +impl Tr for Self {} //~ ERROR cycle detected +impl Tr for S {} //~ ERROR cycle detected +impl Self {} //~ ERROR cycle detected +impl S {} //~ ERROR cycle detected +impl Tr 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 447505e886f81..f240a34817db5 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 68c20df5f7217..85681b478e21d 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 99a7dd5e7852b..54d5487576433 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 ca639f1076d3c..3b20451b10215 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) {} | ^^^^^^^^^^^^^^^^^^^^^^ -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 e4d6076868717..83359bf1675d9 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 c1612b8cb6786..1a48e6a6de1c6 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 c587c00279bde..0fbe2f7a41177 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 553ddaa1a8104..313cfa0c16260 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 5903acc8b7a6d..c3664e0abe114 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 8cf296bc6db6c..54edf42679aef 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 7ab4bd46ebf46..541f54ca76891 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 34f8a0a48431c..5ae4ce1f7ee30 100644 --- a/src/test/ui/resolve/issue-23305.rs +++ b/src/test/ui/resolve/issue-23305.rs @@ -13,6 +13,6 @@ pub trait ToNbt { } impl ToNbt {} -//~^ 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 63b7ab78b13e0..d25a072fe0a88 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 `` --> $DIR/issue-23305.rs:15:12 | LL | impl ToNbt {} - | ^^^^ cyclic reference + | ^^^^ | -note: the cycle begins when processing ``... - --> $DIR/issue-23305.rs:15:1 - | -LL | impl ToNbt {} - | ^^^^^^^^^^^^^^^^ - = note: ...which then again requires processing ``, completing the cycle. + = note: ...which again requires processing ``, completing the cycle error: aborting due to previous error