31 lines
801 B
Rust
31 lines
801 B
Rust
|
|
//@ revisions: current next
|
||
|
|
//@[next] compile-flags: -Znext-solver
|
||
|
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||
|
|
//@ check-pass
|
||
|
|
#![allow(unconditional_recursion)]
|
||
|
|
|
||
|
|
// Regression test for trait-system-refactor-initiative#182.
|
||
|
|
|
||
|
|
trait Id {
|
||
|
|
type This;
|
||
|
|
}
|
||
|
|
impl<T> Id for T {
|
||
|
|
type This = T;
|
||
|
|
}
|
||
|
|
fn to_assoc<T>(x: T) -> <T as Id>::This {
|
||
|
|
x
|
||
|
|
}
|
||
|
|
|
||
|
|
fn mirror<T>(x: Vec<T>) -> impl Id<This = Vec<T>> {
|
||
|
|
let x = to_assoc(mirror(x));
|
||
|
|
// `?x` equals `<opaque::<T> as Id>::This`. We need to eagerly infer the
|
||
|
|
// type of `?x` to prevent this method call from resulting in an error.
|
||
|
|
//
|
||
|
|
// We could use both the item bound to normalize to `Vec<T>`, or the
|
||
|
|
// blanket impl to normalize to `opaque::<T>`. We have to go with the
|
||
|
|
// item bound.
|
||
|
|
x.len();
|
||
|
|
x
|
||
|
|
}
|
||
|
|
fn main() {}
|