Skip to content

Commit da44d72

Browse files
committed
add test for inductive cycle hangs
1 parent 608f324 commit da44d72

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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`.

0 commit comments

Comments
 (0)