// compile-flags: -Znext-solver // Proving `W: Trait` instantiates `?0` with `(W, W)` and then // proves `W: Trait` and `W: Trait`, resulting in a coinductive cycle. // // Proving coinductive cycles runs until we reach a fixpoint. However, after // computing `try_evaluate_added_goals` in the second fixpoint iteration, the // self type already has a depth equal to the number of steps. This results // in enormous constraints, causing the canonicalizer to hang without ever // reaching the recursion limit. We currently avoid that by erasing the constraints // from overflow. // // This previously caused a hang in the trait solver, see // https://github.com/rust-lang/trait-system-refactor-initiative/issues/13. #![feature(rustc_attrs)] #[rustc_coinductive] trait Trait {} struct W(T); impl Trait for W<(W, W)> where W: Trait, W: Trait, { } fn impls() {} fn main() { impls::>(); //~^ ERROR overflow evaluating the requirement }