Skip to content

Commit

Permalink
coinductive cycle leak check test
Browse files Browse the repository at this point in the history
  • Loading branch information
lcnr committed May 30, 2023
1 parent 5119f7d commit dccc8db
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs
Original file line number Diff line number Diff line change
@@ -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::<(&(), &()), _>();
}

0 comments on commit dccc8db

Please sign in to comment.