diff options
| author | lcnr <rust@lcnr.de> | 2023-05-26 14:06:41 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2023-05-30 13:04:27 +0200 |
| commit | dccc8db17dafa8b56bbfa1e57249845cb95cbe04 (patch) | |
| tree | 109dc00e798b1518bc5fb2b3aa97347c7a856e22 | |
| parent | 5119f7da18eb7f10457d3e4b2c1d60f8d94a4cbf (diff) | |
| download | rust-dccc8db17dafa8b56bbfa1e57249845cb95cbe04.tar.gz rust-dccc8db17dafa8b56bbfa1e57249845cb95cbe04.zip | |
coinductive cycle leak check test
| -rw-r--r-- | tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs b/tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs new file mode 100644 index 00000000000..1f7d4a49c90 --- /dev/null +++ b/tests/ui/traits/new-solver/leak-check-coinductive-cycle.rs @@ -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::<(&(), &()), _>(); +} |
