-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add test from chalk#788 for new solver
- Loading branch information
Showing
2 changed files
with
75 additions
and
0 deletions.
There are no files selected for viewing
46 changes: 46 additions & 0 deletions
46
tests/ui/traits/new-solver/cycles/inductive-not-on-stack.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// compile-flags: -Ztrait-solver=next | ||
#![feature(rustc_attrs, trivial_bounds)] | ||
|
||
// We have to be careful here: | ||
// | ||
// We either have the provisional result of `A -> B -> A` on the | ||
// stack, which is a fully coinductive cycle. Accessing the | ||
// provisional result for `B` as part of the `A -> C -> B -> A` cycle | ||
// has to make sure we don't just use the result of `A -> B -> A` as the | ||
// new cycle is inductive. | ||
// | ||
// Alternatively, if we have `A -> C -> A` first, then `A -> B -> A` has | ||
// a purely inductive stack, so something could also go wrong here. | ||
|
||
#[rustc_coinductive] | ||
trait A {} | ||
#[rustc_coinductive] | ||
trait B {} | ||
trait C {} | ||
|
||
impl<T: B + C> A for T {} | ||
impl<T: A> B for T {} | ||
impl<T: B> C for T {} | ||
|
||
fn impls_a<T: A>() {} | ||
|
||
// The same test with reordered where clauses to make sure we're actually testing anything. | ||
#[rustc_coinductive] | ||
trait AR {} | ||
#[rustc_coinductive] | ||
trait BR {} | ||
trait CR {} | ||
|
||
impl<T: CR + BR> AR for T {} | ||
impl<T: AR> BR for T {} | ||
impl<T: BR> CR for T {} | ||
|
||
fn impls_ar<T: AR>() {} | ||
|
||
fn main() { | ||
impls_a::<()>(); | ||
//~^ ERROR overflow evaluating the requirement `(): A` | ||
|
||
impls_ar::<()>(); | ||
//~^ ERROR overflow evaluating the requirement `(): AR` | ||
} |
29 changes: 29 additions & 0 deletions
29
tests/ui/traits/new-solver/cycles/inductive-not-on-stack.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
error[E0275]: overflow evaluating the requirement `(): A` | ||
--> $DIR/inductive-not-on-stack.rs:41:5 | ||
| | ||
LL | impls_a::<()>(); | ||
| ^^^^^^^^^^^^^ | ||
| | ||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inductive_not_on_stack`) | ||
note: required by a bound in `impls_a` | ||
--> $DIR/inductive-not-on-stack.rs:25:15 | ||
| | ||
LL | fn impls_a<T: A>() {} | ||
| ^ required by this bound in `impls_a` | ||
|
||
error[E0275]: overflow evaluating the requirement `(): AR` | ||
--> $DIR/inductive-not-on-stack.rs:44:5 | ||
| | ||
LL | impls_ar::<()>(); | ||
| ^^^^^^^^^^^^^^ | ||
| | ||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inductive_not_on_stack`) | ||
note: required by a bound in `impls_ar` | ||
--> $DIR/inductive-not-on-stack.rs:38:16 | ||
| | ||
LL | fn impls_ar<T: AR>() {} | ||
| ^^ required by this bound in `impls_ar` | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0275`. |