File tree 2 files changed +48
-0
lines changed
tests/ui/traits/new-solver/cycles
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