File tree 2 files changed +52
-0
lines changed
tests/ui/traits/new-solver/cycles
2 files changed +52
-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 continues
16
+ // to grow until evaluating the nested goals ends up hitting the recursion limit.
17
+ //
18
+ // By then the exponential blowup from having 2 nested goals per impl causes
19
+ // the solver to hang. In this concrete example a provisional cache should prevent
20
+ // the hang.
21
+ trait Trait { }
22
+
23
+ struct W < T : ?Sized > ( * const T ) ;
24
+
25
+ impl < T : ?Sized > Trait for W < W < T > >
26
+ where
27
+ W < T > : Trait ,
28
+ W < T > : Trait ,
29
+ { }
30
+
31
+ fn impls_trait < T : Trait > ( ) { }
32
+
33
+ fn main ( ) {
34
+ impls_trait :: < W < _ > > ( ) ;
35
+ //~^ ERROR overflow evaluating the requirement
36
+ }
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