From eacebf24b0e42df1cc8161d8a5023c83d24ddced Mon Sep 17 00:00:00 2001 From: scalexm Date: Wed, 31 Oct 2018 18:55:40 +0100 Subject: [PATCH] Pretty print quantified goals and clauses --- src/librustc/traits/structural_impls.rs | 149 +++++++++++++++++- src/librustc_traits/lowering/environment.rs | 4 +- src/librustc_traits/lowering/mod.rs | 9 +- src/test/ui/chalkify/lower_env1.rs | 2 +- src/test/ui/chalkify/lower_env1.stderr | 13 +- src/test/ui/chalkify/lower_env2.rs | 4 +- src/test/ui/chalkify/lower_env2.stderr | 16 +- src/test/ui/chalkify/lower_env3.stderr | 8 +- src/test/ui/chalkify/lower_impl.stderr | 4 +- src/test/ui/chalkify/lower_struct.rs | 4 +- src/test/ui/chalkify/lower_struct.stderr | 7 +- src/test/ui/chalkify/lower_trait.stderr | 14 +- .../ui/chalkify/lower_trait_higher_rank.rs | 3 +- .../chalkify/lower_trait_higher_rank.stderr | 9 +- .../ui/chalkify/lower_trait_where_clause.rs | 14 +- .../chalkify/lower_trait_where_clause.stderr | 17 +- 16 files changed, 198 insertions(+), 79 deletions(-) diff --git a/src/librustc/traits/structural_impls.rs b/src/librustc/traits/structural_impls.rs index e83d085971c..66d9c6711bb 100644 --- a/src/librustc/traits/structural_impls.rs +++ b/src/librustc/traits/structural_impls.rs @@ -14,9 +14,11 @@ use traits; use traits::project::Normalized; use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use ty::{self, Lift, TyCtxt}; +use syntax::symbol::InternedString; use std::fmt; use std::rc::Rc; +use std::collections::{BTreeSet, BTreeMap}; // structural impls for the structs in traits @@ -479,7 +481,12 @@ impl<'tcx> fmt::Display for traits::DomainGoal<'tcx> { Holds(wc) => write!(fmt, "{}", wc), WellFormed(wf) => write!(fmt, "{}", wf), FromEnv(from_env) => write!(fmt, "{}", from_env), - Normalize(projection) => write!(fmt, "Normalize({})", projection), + Normalize(projection) => write!( + fmt, + "Normalize({} -> {})", + projection.projection_ty, + projection.ty + ), } } } @@ -495,6 +502,110 @@ impl fmt::Display for traits::QuantifierKind { } } +/// Collect names for regions / types bound by a quantified goal / clause. +/// This collector does not try to do anything clever like in ppaux, it's just used +/// for debug output in tests anyway. +struct BoundNamesCollector { + // Just sort by name because `BoundRegion::BrNamed` does not have a `BoundVar` index anyway. + regions: BTreeSet, + + // Sort by `BoundVar` index, so usually this should be equivalent to the order given + // by the list of type parameters. + types: BTreeMap, + + binder_index: ty::DebruijnIndex, +} + +impl BoundNamesCollector { + fn new() -> Self { + BoundNamesCollector { + regions: BTreeSet::new(), + types: BTreeMap::new(), + binder_index: ty::INNERMOST, + } + } + + fn is_empty(&self) -> bool { + self.regions.is_empty() && self.types.is_empty() + } + + fn write_names(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut start = true; + for r in &self.regions { + if !start { + write!(fmt, ", ")?; + } + start = false; + write!(fmt, "{}", r)?; + } + for (_, t) in &self.types { + if !start { + write!(fmt, ", ")?; + } + start = false; + write!(fmt, "{}", t)?; + } + Ok(()) + } +} + +impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector { + fn visit_binder>(&mut self, t: &ty::Binder) -> bool { + self.binder_index.shift_in(1); + let result = t.super_visit_with(self); + self.binder_index.shift_out(1); + result + } + + fn visit_ty(&mut self, t: ty::Ty<'tcx>) -> bool { + use syntax::symbol::Symbol; + + match t.sty { + ty::Bound(bound_ty) if bound_ty.index == self.binder_index => { + self.types.insert( + bound_ty.var.as_u32(), + match bound_ty.kind { + ty::BoundTyKind::Param(name) => name, + ty::BoundTyKind::Anon => Symbol::intern( + &format!("?{}", bound_ty.var.as_u32()) + ).as_interned_str(), + } + ); + } + + _ => (), + }; + + t.super_visit_with(self) + } + + fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { + use syntax::symbol::Symbol; + + match r { + ty::ReLateBound(index, br) if *index == self.binder_index => { + match br { + ty::BoundRegion::BrNamed(_, name) => { + self.regions.insert(*name); + } + + ty::BoundRegion::BrAnon(var) => { + self.regions.insert(Symbol::intern( + &format!("?'{}", var) + ).as_interned_str()); + } + + _ => (), + } + } + + _ => (), + }; + + r.super_visit_with(self) + } +} + impl<'tcx> fmt::Display for traits::Goal<'tcx> { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { use traits::GoalKind::*; @@ -514,8 +625,22 @@ impl<'tcx> fmt::Display for traits::Goal<'tcx> { Not(goal) => write!(fmt, "not {{ {} }}", goal), DomainGoal(goal) => write!(fmt, "{}", goal), Quantified(qkind, goal) => { - // FIXME: appropriate binder names - write!(fmt, "{}<> {{ {} }}", qkind, goal.skip_binder()) + let mut collector = BoundNamesCollector::new(); + goal.skip_binder().visit_with(&mut collector); + + if !collector.is_empty() { + write!(fmt, "{}<", qkind)?; + collector.write_names(fmt)?; + write!(fmt, "> {{ ")?; + } + + write!(fmt, "{}", goal.skip_binder())?; + + if !collector.is_empty() { + write!(fmt, " }}")?; + } + + Ok(()) } CannotProve => write!(fmt, "CannotProve"), } @@ -546,8 +671,22 @@ impl<'tcx> fmt::Display for traits::Clause<'tcx> { match self { Implies(clause) => write!(fmt, "{}", clause), ForAll(clause) => { - // FIXME: appropriate binder names - write!(fmt, "forall<> {{ {} }}", clause.skip_binder()) + let mut collector = BoundNamesCollector::new(); + clause.skip_binder().visit_with(&mut collector); + + if !collector.is_empty() { + write!(fmt, "forall<")?; + collector.write_names(fmt)?; + write!(fmt, "> {{ ")?; + } + + write!(fmt, "{}", clause.skip_binder())?; + + if !collector.is_empty() { + write!(fmt, " }}")?; + } + + Ok(()) } } } diff --git a/src/librustc_traits/lowering/environment.rs b/src/librustc_traits/lowering/environment.rs index c5dc91dec6b..7042c9f515d 100644 --- a/src/librustc_traits/lowering/environment.rs +++ b/src/librustc_traits/lowering/environment.rs @@ -250,8 +250,8 @@ crate fn environment<'a, 'tcx>( // In an fn, we assume that the arguments and all their constituents are // well-formed. if is_fn { - // `skip_binder` because we move late bound regions to the root binder, - // restored in the return type + // `skip_binder` because we move region parameters to the root binder, + // restored in the return type of this query let fn_sig = tcx.fn_sig(def_id).skip_binder().subst(tcx, bound_vars); input_tys.extend( diff --git a/src/librustc_traits/lowering/mod.rs b/src/librustc_traits/lowering/mod.rs index fc25faed3de..021ec18009a 100644 --- a/src/librustc_traits/lowering/mod.rs +++ b/src/librustc_traits/lowering/mod.rs @@ -600,14 +600,7 @@ impl<'a, 'tcx> ClauseDumper<'a, 'tcx> { let mut strings: Vec<_> = clauses .iter() - .map(|clause| { - // Skip the top-level binder for a less verbose output - let program_clause = match clause { - Clause::Implies(program_clause) => program_clause, - Clause::ForAll(program_clause) => program_clause.skip_binder(), - }; - program_clause.to_string() - }) + .map(|clause| clause.to_string()) .collect(); strings.sort(); diff --git a/src/test/ui/chalkify/lower_env1.rs b/src/test/ui/chalkify/lower_env1.rs index fc20ad0e08b..b772db5ca55 100644 --- a/src/test/ui/chalkify/lower_env1.rs +++ b/src/test/ui/chalkify/lower_env1.rs @@ -17,7 +17,7 @@ trait Foo { } trait Bar where Self: Foo { } #[rustc_dump_env_program_clauses] //~ ERROR program clause dump -fn bar() { +fn bar() { } fn main() { diff --git a/src/test/ui/chalkify/lower_env1.stderr b/src/test/ui/chalkify/lower_env1.stderr index 3aa04cfeb67..4aa40bae319 100644 --- a/src/test/ui/chalkify/lower_env1.stderr +++ b/src/test/ui/chalkify/lower_env1.stderr @@ -4,9 +4,9 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(Self: Foo) :- FromEnv(Self: Bar). - = note: Implemented(Self: Bar) :- FromEnv(Self: Bar). - = note: WellFormed(Self: Bar) :- Implemented(Self: Bar), WellFormed(Self: Foo). + = note: forall { FromEnv(Self: Foo) :- FromEnv(Self: Bar). } + = note: forall { Implemented(Self: Bar) :- FromEnv(Self: Bar). } + = note: forall { WellFormed(Self: Bar) :- Implemented(Self: Bar), WellFormed(Self: Foo). } error: program clause dump --> $DIR/lower_env1.rs:19:1 @@ -14,10 +14,9 @@ error: program clause dump LL | #[rustc_dump_env_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(Self: Foo) :- FromEnv(Self: Bar). - = note: Implemented(Self: Bar) :- FromEnv(Self: Bar). - = note: Implemented(Self: Foo) :- FromEnv(Self: Foo). - = note: Implemented(Self: std::marker::Sized) :- FromEnv(Self: std::marker::Sized). + = note: forall { FromEnv(Self: Foo) :- FromEnv(Self: Bar). } + = note: forall { Implemented(Self: Bar) :- FromEnv(Self: Bar). } + = note: forall { Implemented(Self: Foo) :- FromEnv(Self: Foo). } error: aborting due to 2 previous errors diff --git a/src/test/ui/chalkify/lower_env2.rs b/src/test/ui/chalkify/lower_env2.rs index 0b50dbfdf95..2328db5b4f6 100644 --- a/src/test/ui/chalkify/lower_env2.rs +++ b/src/test/ui/chalkify/lower_env2.rs @@ -14,12 +14,12 @@ trait Foo { } #[rustc_dump_program_clauses] //~ ERROR program clause dump -struct S<'a, T> where T: Foo { +struct S<'a, T: ?Sized> where T: Foo { data: &'a T, } #[rustc_dump_env_program_clauses] //~ ERROR program clause dump -fn bar<'a, T: Foo>(x: S) { +fn bar(_x: S<'_, T>) { // note that we have an implicit `T: Sized` bound } fn main() { diff --git a/src/test/ui/chalkify/lower_env2.stderr b/src/test/ui/chalkify/lower_env2.stderr index 3b88ac1f22b..aaf6eda641d 100644 --- a/src/test/ui/chalkify/lower_env2.stderr +++ b/src/test/ui/chalkify/lower_env2.stderr @@ -4,10 +4,9 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(T: Foo) :- FromEnv(S<'a, T>). - = note: FromEnv(T: std::marker::Sized) :- FromEnv(S<'a, T>). - = note: TypeOutlives(T : 'a) :- FromEnv(S<'a, T>). - = note: WellFormed(S<'a, T>) :- Implemented(T: std::marker::Sized), Implemented(T: Foo), TypeOutlives(T : 'a). + = note: forall<'a, T> { FromEnv(T: Foo) :- FromEnv(S<'a, T>). } + = note: forall<'a, T> { TypeOutlives(T : 'a) :- FromEnv(S<'a, T>). } + = note: forall<'a, T> { WellFormed(S<'a, T>) :- Implemented(T: Foo), TypeOutlives(T : 'a). } error: program clause dump --> $DIR/lower_env2.rs:21:1 @@ -15,11 +14,10 @@ error: program clause dump LL | #[rustc_dump_env_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(T: Foo) :- FromEnv(S<'a, T>). - = note: FromEnv(T: std::marker::Sized) :- FromEnv(S<'a, T>). - = note: Implemented(Self: Foo) :- FromEnv(Self: Foo). - = note: Implemented(Self: std::marker::Sized) :- FromEnv(Self: std::marker::Sized). - = note: TypeOutlives(T : 'a) :- FromEnv(S<'a, T>). + = note: forall<'a, T> { FromEnv(T: Foo) :- FromEnv(S<'a, T>). } + = note: forall<'a, T> { TypeOutlives(T : 'a) :- FromEnv(S<'a, T>). } + = note: forall { Implemented(Self: Foo) :- FromEnv(Self: Foo). } + = note: forall { Implemented(Self: std::marker::Sized) :- FromEnv(Self: std::marker::Sized). } error: aborting due to 2 previous errors diff --git a/src/test/ui/chalkify/lower_env3.stderr b/src/test/ui/chalkify/lower_env3.stderr index ac0f8e34cd4..f507deb6fa0 100644 --- a/src/test/ui/chalkify/lower_env3.stderr +++ b/src/test/ui/chalkify/lower_env3.stderr @@ -4,7 +4,7 @@ error: program clause dump LL | #[rustc_dump_env_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Implemented(Self: Foo) :- FromEnv(Self: Foo). + = note: forall { Implemented(Self: Foo) :- FromEnv(Self: Foo). } error: program clause dump --> $DIR/lower_env3.rs:20:5 @@ -12,9 +12,9 @@ error: program clause dump LL | #[rustc_dump_env_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(Self: std::marker::Sized) :- FromEnv(Self: std::clone::Clone). - = note: Implemented(Self: std::clone::Clone) :- FromEnv(Self: std::clone::Clone). - = note: Implemented(Self: std::marker::Sized) :- FromEnv(Self: std::marker::Sized). + = note: forall { FromEnv(Self: std::marker::Sized) :- FromEnv(Self: std::clone::Clone). } + = note: forall { Implemented(Self: std::clone::Clone) :- FromEnv(Self: std::clone::Clone). } + = note: forall { Implemented(Self: std::marker::Sized) :- FromEnv(Self: std::marker::Sized). } error: aborting due to 2 previous errors diff --git a/src/test/ui/chalkify/lower_impl.stderr b/src/test/ui/chalkify/lower_impl.stderr index c497d76f8d4..ed84fe4eb26 100644 --- a/src/test/ui/chalkify/lower_impl.stderr +++ b/src/test/ui/chalkify/lower_impl.stderr @@ -4,7 +4,7 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Implemented(T: Foo) :- ProjectionEq(::Item == i32), TypeOutlives(T : 'static), Implemented(T: std::iter::Iterator), Implemented(T: std::marker::Sized). + = note: forall { Implemented(T: Foo) :- ProjectionEq(::Item == i32), TypeOutlives(T : 'static), Implemented(T: std::iter::Iterator), Implemented(T: std::marker::Sized). } error: program clause dump --> $DIR/lower_impl.rs:23:5 @@ -12,7 +12,7 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Normalize(::Assoc == std::vec::Vec) :- Implemented(T: Bar). + = note: forall { Normalize(::Assoc -> std::vec::Vec) :- Implemented(T: Bar). } error: aborting due to 2 previous errors diff --git a/src/test/ui/chalkify/lower_struct.rs b/src/test/ui/chalkify/lower_struct.rs index 9287555a056..9b4bba67112 100644 --- a/src/test/ui/chalkify/lower_struct.rs +++ b/src/test/ui/chalkify/lower_struct.rs @@ -11,8 +11,8 @@ #![feature(rustc_attrs)] #[rustc_dump_program_clauses] //~ ERROR program clause dump -struct Foo where Box: Clone { - _x: std::marker::PhantomData, +struct Foo<'a, T> where Box: Clone { + _x: std::marker::PhantomData<&'a T>, } fn main() { } diff --git a/src/test/ui/chalkify/lower_struct.stderr b/src/test/ui/chalkify/lower_struct.stderr index d6cc9c8e9a4..a12ee52a086 100644 --- a/src/test/ui/chalkify/lower_struct.stderr +++ b/src/test/ui/chalkify/lower_struct.stderr @@ -4,9 +4,10 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(T: std::marker::Sized) :- FromEnv(Foo). - = note: FromEnv(std::boxed::Box: std::clone::Clone) :- FromEnv(Foo). - = note: WellFormed(Foo) :- Implemented(T: std::marker::Sized), Implemented(std::boxed::Box: std::clone::Clone). + = note: forall<'a, T> { FromEnv(T: std::marker::Sized) :- FromEnv(Foo<'a, T>). } + = note: forall<'a, T> { FromEnv(std::boxed::Box: std::clone::Clone) :- FromEnv(Foo<'a, T>). } + = note: forall<'a, T> { TypeOutlives(T : 'a) :- FromEnv(Foo<'a, T>). } + = note: forall<'a, T> { WellFormed(Foo<'a, T>) :- Implemented(T: std::marker::Sized), Implemented(std::boxed::Box: std::clone::Clone), TypeOutlives(T : 'a). } error: aborting due to previous error diff --git a/src/test/ui/chalkify/lower_trait.stderr b/src/test/ui/chalkify/lower_trait.stderr index dc2375277e7..6a3f7aa6376 100644 --- a/src/test/ui/chalkify/lower_trait.stderr +++ b/src/test/ui/chalkify/lower_trait.stderr @@ -4,10 +4,10 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(>::Assoc: Bar) :- FromEnv(Self: Foo). - = note: FromEnv(S: std::marker::Sized) :- FromEnv(Self: Foo). - = note: Implemented(Self: Foo) :- FromEnv(Self: Foo). - = note: WellFormed(Self: Foo) :- Implemented(Self: Foo), WellFormed(S: std::marker::Sized), WellFormed(>::Assoc: Bar). + = note: forall { FromEnv(>::Assoc: Bar) :- FromEnv(Self: Foo). } + = note: forall { FromEnv(S: std::marker::Sized) :- FromEnv(Self: Foo). } + = note: forall { Implemented(Self: Foo) :- FromEnv(Self: Foo). } + = note: forall { WellFormed(Self: Foo) :- Implemented(Self: Foo), WellFormed(S: std::marker::Sized), WellFormed(>::Assoc: Bar). } error: program clause dump --> $DIR/lower_trait.rs:17:5 @@ -15,9 +15,9 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(Self: Foo) :- FromEnv(Unnormalized(>::Assoc)). - = note: ProjectionEq(>::Assoc == Unnormalized(>::Assoc)). - = note: WellFormed(Unnormalized(>::Assoc)) :- Implemented(Self: Foo). + = note: forall { FromEnv(Self: Foo) :- FromEnv(Unnormalized(>::Assoc)). } + = note: forall { ProjectionEq(>::Assoc == Unnormalized(>::Assoc)). } + = note: forall { WellFormed(Unnormalized(>::Assoc)) :- Implemented(Self: Foo). } error: aborting due to 2 previous errors diff --git a/src/test/ui/chalkify/lower_trait_higher_rank.rs b/src/test/ui/chalkify/lower_trait_higher_rank.rs index 7fc48cfd56d..c0e1d8fc4c8 100644 --- a/src/test/ui/chalkify/lower_trait_higher_rank.rs +++ b/src/test/ui/chalkify/lower_trait_higher_rank.rs @@ -11,9 +11,8 @@ #![feature(rustc_attrs)] #[rustc_dump_program_clauses] //~ ERROR program clause dump -trait Foo where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8 +trait Foo where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8 { - fn s(_: F) -> F; } fn main() { diff --git a/src/test/ui/chalkify/lower_trait_higher_rank.stderr b/src/test/ui/chalkify/lower_trait_higher_rank.stderr index afb2cd4b563..6d3e0ec55b2 100644 --- a/src/test/ui/chalkify/lower_trait_higher_rank.stderr +++ b/src/test/ui/chalkify/lower_trait_higher_rank.stderr @@ -4,11 +4,10 @@ error: program clause dump LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(F: std::marker::Sized) :- FromEnv(Self: Foo). - = note: FromEnv(F: std::ops::Fn<(&'a (u8, u16),)>) :- FromEnv(Self: Foo). - = note: Implemented(Self: Foo) :- FromEnv(Self: Foo). - = note: ProjectionEq(>::Output == &'a u8) :- FromEnv(Self: Foo). - = note: WellFormed(Self: Foo) :- Implemented(Self: Foo), WellFormed(F: std::marker::Sized), forall<> { WellFormed(F: std::ops::Fn<(&'a (u8, u16),)>) }, forall<> { ProjectionEq(>::Output == &'a u8) }. + = note: forall<'a, Self, F> { FromEnv(F: std::ops::Fn<(&'a (u8, u16),)>) :- FromEnv(Self: Foo). } + = note: forall<'a, Self, F> { ProjectionEq(>::Output == &'a u8) :- FromEnv(Self: Foo). } + = note: forall { Implemented(Self: Foo) :- FromEnv(Self: Foo). } + = note: forall { WellFormed(Self: Foo) :- Implemented(Self: Foo), forall<'a> { WellFormed(F: std::ops::Fn<(&'a (u8, u16),)>) }, forall<'a> { ProjectionEq(>::Output == &'a u8) }. } error: aborting due to previous error diff --git a/src/test/ui/chalkify/lower_trait_where_clause.rs b/src/test/ui/chalkify/lower_trait_where_clause.rs index 5305591b843..ac58c0bf2fe 100644 --- a/src/test/ui/chalkify/lower_trait_where_clause.rs +++ b/src/test/ui/chalkify/lower_trait_where_clause.rs @@ -10,22 +10,16 @@ #![feature(rustc_attrs)] -use std::fmt::{Debug, Display}; use std::borrow::Borrow; #[rustc_dump_program_clauses] //~ ERROR program clause dump -trait Foo<'a, 'b, S, T, U> +trait Foo<'a, 'b, T, U> where - S: Debug, - T: Borrow, - U: ?Sized, + T: Borrow + ?Sized, + U: ?Sized + 'b, 'a: 'b, - U: 'b, - Vec:, // NOTE(#53696) this checks an empty list of bounds. + Box:, // NOTE(#53696) this checks an empty list of bounds. { - fn s(_: S) -> S; - fn t(_: T) -> T; - fn u(_: U) -> U; } fn main() { diff --git a/src/test/ui/chalkify/lower_trait_where_clause.stderr b/src/test/ui/chalkify/lower_trait_where_clause.stderr index ad3546da1a2..f4f3effaaae 100644 --- a/src/test/ui/chalkify/lower_trait_where_clause.stderr +++ b/src/test/ui/chalkify/lower_trait_where_clause.stderr @@ -1,18 +1,15 @@ error: program clause dump - --> $DIR/lower_trait_where_clause.rs:16:1 + --> $DIR/lower_trait_where_clause.rs:15:1 | LL | #[rustc_dump_program_clauses] //~ ERROR program clause dump | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: FromEnv(S: std::fmt::Debug) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: FromEnv(S: std::marker::Sized) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: FromEnv(T: std::borrow::Borrow) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: FromEnv(T: std::marker::Sized) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: Implemented(Self: Foo<'a, 'b, S, T, U>) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: RegionOutlives('a : 'b) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: TypeOutlives(U : 'b) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). - = note: WellFormed(Self: Foo<'a, 'b, S, T, U>) :- Implemented(Self: Foo<'a, 'b, S, T, U>), WellFormed(S: std::marker::Sized), WellFormed(T: std::marker::Sized), WellFormed(S: std::fmt::Debug), WellFormed(T: std::borrow::Borrow), RegionOutlives('a : 'b), TypeOutlives(U : 'b), WellFormed(std::vec::Vec). - = note: WellFormed(std::vec::Vec) :- FromEnv(Self: Foo<'a, 'b, S, T, U>). + = note: forall<'a, 'b, Self, T, U> { FromEnv(T: std::borrow::Borrow) :- FromEnv(Self: Foo<'a, 'b, T, U>). } + = note: forall<'a, 'b, Self, T, U> { Implemented(Self: Foo<'a, 'b, T, U>) :- FromEnv(Self: Foo<'a, 'b, T, U>). } + = note: forall<'a, 'b, Self, T, U> { RegionOutlives('a : 'b) :- FromEnv(Self: Foo<'a, 'b, T, U>). } + = note: forall<'a, 'b, Self, T, U> { TypeOutlives(U : 'b) :- FromEnv(Self: Foo<'a, 'b, T, U>). } + = note: forall<'a, 'b, Self, T, U> { WellFormed(Self: Foo<'a, 'b, T, U>) :- Implemented(Self: Foo<'a, 'b, T, U>), WellFormed(T: std::borrow::Borrow), TypeOutlives(U : 'b), RegionOutlives('a : 'b), WellFormed(std::boxed::Box). } + = note: forall<'a, 'b, Self, T, U> { WellFormed(std::boxed::Box) :- FromEnv(Self: Foo<'a, 'b, T, U>). } error: aborting due to previous error