diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_traits/lowering/mod.rs | 9 | ||||
| -rw-r--r-- | src/test/compile-fail/chalkify/recursive_where_clause_on_type.rs | 28 | ||||
| -rw-r--r-- | src/test/ui/chalkify/lower_env2.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/chalkify/lower_struct.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/chalkify/lower_trait.stderr | 2 |
5 files changed, 36 insertions, 7 deletions
diff --git a/src/librustc_traits/lowering/mod.rs b/src/librustc_traits/lowering/mod.rs index 0cbfa7c626f..c3cbdb03762 100644 --- a/src/librustc_traits/lowering/mod.rs +++ b/src/librustc_traits/lowering/mod.rs @@ -337,7 +337,7 @@ pub fn program_clauses_for_type_def<'a, 'tcx>( // // ``` // forall<P1..Pn> { - // WellFormed(Ty<...>) :- WC1, ..., WCm` + // WellFormed(Ty<...>) :- WellFormed(WC1), ..., WellFormed(WCm)` // } // ``` @@ -354,13 +354,14 @@ pub fn program_clauses_for_type_def<'a, 'tcx>( .map(|(wc, _)| wc.lower()) .collect::<Vec<_>>(); - // `WellFormed(Ty<...>) :- WC1, ..., WCm` + // `WellFormed(Ty<...>) :- WellFormed(WC1), ..., WellFormed(WCm)` let well_formed_clause = ProgramClause { goal: DomainGoal::WellFormed(WellFormed::Ty(ty)), hypotheses: tcx.mk_goals( where_clauses .iter() .map(|wc| wc.subst(tcx, bound_vars)) + .map(|wc| wc.map_bound(|bound| bound.into_well_formed_goal())) .map(|wc| tcx.mk_goal(GoalKind::from_poly_domain_goal(wc, tcx))), ), category: ProgramClauseCategory::WellFormed, @@ -457,13 +458,13 @@ pub fn program_clauses_for_associated_type_def<'a, 'tcx>( // ``` // forall<Self, P1..Pn, Pn+1..Pm> { // WellFormed((Trait::AssocType)<Self, P1..Pn, Pn+1..Pm>) - // :- Implemented(Self: Trait<P1..Pn>) + // :- WellFormed(Self: Trait<P1..Pn>) // } // ``` let trait_predicate = ty::TraitPredicate { trait_ref }; let hypothesis = tcx.mk_goal( - DomainGoal::Holds(WhereClause::Implemented(trait_predicate)).into_goal() + DomainGoal::WellFormed(WellFormed::Trait(trait_predicate)).into_goal() ); let wf_clause = ProgramClause { diff --git a/src/test/compile-fail/chalkify/recursive_where_clause_on_type.rs b/src/test/compile-fail/chalkify/recursive_where_clause_on_type.rs new file mode 100644 index 00000000000..861f86e6165 --- /dev/null +++ b/src/test/compile-fail/chalkify/recursive_where_clause_on_type.rs @@ -0,0 +1,28 @@ +// compile-flags: -Z chalk + +#![feature(trivial_bounds)] + +trait Bar { + fn foo(); +} +trait Foo: Bar { } + +struct S where S: Foo; + +impl Foo for S { +} + +fn bar<T: Bar>() { + T::foo(); +} + +fn foo<T: Foo>() { + bar::<T>() +} + +fn main() { + // For some reason, the error is duplicated... + + foo::<S>() //~ ERROR the type `S` is not well-formed (chalk) + //~^ ERROR the type `S` is not well-formed (chalk) +} diff --git a/src/test/ui/chalkify/lower_env2.stderr b/src/test/ui/chalkify/lower_env2.stderr index 2a71fa9df5e..613a568a854 100644 --- a/src/test/ui/chalkify/lower_env2.stderr +++ b/src/test/ui/chalkify/lower_env2.stderr @@ -6,7 +6,7 @@ LL | #[rustc_dump_program_clauses] | = 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). } + = note: forall<'a, T> { WellFormed(S<'a, T>) :- WellFormed(T: Foo), TypeOutlives(T: 'a). } error: program clause dump --> $DIR/lower_env2.rs:11:1 diff --git a/src/test/ui/chalkify/lower_struct.stderr b/src/test/ui/chalkify/lower_struct.stderr index 91525c3ba55..0331c2fca16 100644 --- a/src/test/ui/chalkify/lower_struct.stderr +++ b/src/test/ui/chalkify/lower_struct.stderr @@ -7,7 +7,7 @@ LL | #[rustc_dump_program_clauses] = note: forall<'a, T> { FromEnv(T: std::marker::Sized) :- FromEnv(Foo<'a, T>). } = note: forall<'a, T> { FromEnv(std::boxed::Box<T>: 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<T>: std::clone::Clone), TypeOutlives(T: 'a). } + = note: forall<'a, T> { WellFormed(Foo<'a, T>) :- WellFormed(T: std::marker::Sized), WellFormed(std::boxed::Box<T>: 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 423c5573083..ed3bded398a 100644 --- a/src/test/ui/chalkify/lower_trait.stderr +++ b/src/test/ui/chalkify/lower_trait.stderr @@ -18,7 +18,7 @@ LL | #[rustc_dump_program_clauses] = note: forall<Self, S, T, ^3> { ProjectionEq(<Self as Foo<S, T>>::Assoc == ^3) :- Normalize(<Self as Foo<S, T>>::Assoc -> ^3). } = note: forall<Self, S, T> { FromEnv(Self: Foo<S, T>) :- FromEnv(Unnormalized(<Self as Foo<S, T>>::Assoc)). } = note: forall<Self, S, T> { ProjectionEq(<Self as Foo<S, T>>::Assoc == Unnormalized(<Self as Foo<S, T>>::Assoc)). } - = note: forall<Self, S, T> { WellFormed(Unnormalized(<Self as Foo<S, T>>::Assoc)) :- Implemented(Self: Foo<S, T>). } + = note: forall<Self, S, T> { WellFormed(Unnormalized(<Self as Foo<S, T>>::Assoc)) :- WellFormed(Self: Foo<S, T>). } error: aborting due to 2 previous errors |
