File tree Expand file tree Collapse file tree 2 files changed +48
-0
lines changed
tests/ui/traits/new-solver/cycles Expand file tree Collapse file tree 2 files changed +48
-0
lines changed Original file line number Diff line number Diff line change 1+ // compile-flags: -Ztrait-solver=next
2+
3+ // This currently hangs if we do not erase constraints from
4+ // overflow.
5+ //
6+ // We set the provisional result of `W<?0>` to `?0 := W<_>`.
7+ // The next iteration does not simply result in a `?0 := W<W<_>` constraint as
8+ // one might expect, but instead each time we evaluate the nested `W<T>` goal we
9+ // apply the previously returned constraints: the first fixpoint iteration goes
10+ // as follows: `W<?1>: Trait` constrains `?1` to `W<?2>`, we then evaluate
11+ // `W<W<?2>>: Trait` the next time we try to prove the nested goal. This results
12+ // inn `W<W<W<?3>>>` and so on. This goes on until we reach overflow in
13+ // `try_evaluate_added_goals`. This means the provisional result after the
14+ // second fixpoint iteration is already `W<W<W<...>>>` with a size proportional
15+ // to the number of steps in `try_evaluate_added_goals`. The size then grows
16+ // exponentially with each fixpoint iteration.
17+ trait Trait { }
18+
19+ struct W < T : ?Sized > ( * const T ) ;
20+
21+ impl < T : ?Sized > Trait for W < W < T > >
22+ where
23+ W < T > : Trait ,
24+ W < T > : Trait ,
25+ { }
26+
27+ fn impls_trait < T : Trait > ( ) { }
28+
29+ fn main ( ) {
30+ impls_trait :: < W < _ > > ( ) ;
31+ //~^ ERROR overflow evaluating the requirement
32+ }
Original file line number Diff line number Diff line change 1+ error[E0275]: overflow evaluating the requirement `W<_>: Trait`
2+ --> $DIR/inductive-fixpoint-hang.rs:30:19
3+ |
4+ LL | impls_trait::<W<_>>();
5+ | ^^^^
6+ |
7+ = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inductive_fixpoint_hang`)
8+ note: required by a bound in `impls_trait`
9+ --> $DIR/inductive-fixpoint-hang.rs:27:19
10+ |
11+ LL | fn impls_trait<T: Trait>() {}
12+ | ^^^^^ required by this bound in `impls_trait`
13+
14+ error: aborting due to previous error
15+
16+ For more information about this error, try `rustc --explain E0275`.
You can’t perform that action at this time.
0 commit comments