32 lines
597 B
Rust
32 lines
597 B
Rust
//@ check-pass
|
|
//@ compile-flags: -Znext-solver
|
|
|
|
trait Test {
|
|
type Assoc;
|
|
}
|
|
|
|
fn transform<T: Test>(x: Inv<T>) -> Inv<T::Assoc> {
|
|
todo!()
|
|
}
|
|
|
|
impl Test for i32 {
|
|
type Assoc = i32;
|
|
}
|
|
|
|
impl Test for String {
|
|
type Assoc = String;
|
|
}
|
|
|
|
struct Inv<T>(Option<*mut T>);
|
|
|
|
fn main() {
|
|
let mut x: Inv<_> = Inv(None);
|
|
// This ends up equating `Inv<?x>` with `Inv<<?x as Test>::Assoc>`
|
|
// which fails the occurs check when generalizing `?x`.
|
|
//
|
|
// We end up emitting a delayed obligation, causing this to still
|
|
// succeed.
|
|
x = transform(x);
|
|
x = Inv::<i32>(None);
|
|
}
|