coinductive cycle leak check test
This commit is contained in:
parent
5119f7da18
commit
dccc8db17d
1 changed files with 33 additions and 0 deletions
33
tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs
Normal file
33
tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs
Normal file
|
@ -0,0 +1,33 @@
|
|||
// check-pass
|
||||
// compile-flags: -Ztrait-solver=next
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_coinductive]
|
||||
trait Trait<T> {}
|
||||
impl<'a, 'b, T> Trait<T> for (&'a (), &'b ())
|
||||
where
|
||||
'b: 'a,
|
||||
&'a (): Trait<T>,
|
||||
{}
|
||||
|
||||
impl Trait<i32> for &'static () {}
|
||||
impl<'a> Trait<u32> for &'a ()
|
||||
where
|
||||
for<'b> (&'a (), &'b ()): Trait<u32>,
|
||||
{}
|
||||
|
||||
|
||||
fn impls_trait<T: Trait<U>, U>() {}
|
||||
|
||||
fn main() {
|
||||
// This infers to `impls_trait::<(&'static (), &'static ()), i32>();`
|
||||
//
|
||||
// In the first attempt we have 2 candidates for `&'a (): Trait<_>`
|
||||
// and we get ambiguity. The result is therefore ambiguity with a `'b: 'a`
|
||||
// constraint. The next attempt then uses that provisional result when
|
||||
// trying to apply `impl<'a> Trait<u32> for &'a ()`. This means we get a
|
||||
// `for<'b> 'b: 'a` bound which fails the leak check. Because of this we
|
||||
// end up with a single impl for `&'a (): Trait<_>` which infers `_` to `i32`
|
||||
// and succeeds.
|
||||
impls_trait::<(&(), &()), _>();
|
||||
}
|
Loading…
Add table
Reference in a new issue