mirror of https://github.com/rust-lang/rust
34 lines
978 B
Rust
34 lines
978 B
Rust
//@ check-pass
|
|
//@ compile-flags: -Zvalidate-mir
|
|
|
|
// Using -Zvalidate-mir as a regression test for #107346.
|
|
|
|
trait Duh {}
|
|
|
|
impl Duh for i32 {}
|
|
|
|
trait Trait {
|
|
type Assoc: Duh;
|
|
}
|
|
|
|
// the fact that `R` is the `::Output` projection on `F` causes
|
|
// an intermediate inference var to be generated which is then later
|
|
// compared against the actually found `Assoc` type.
|
|
impl<R: Duh, F: FnMut() -> R> Trait for F {
|
|
type Assoc = R;
|
|
}
|
|
|
|
// The `impl Send` here is then later compared against the inference var
|
|
// created, causing the inference var to be set to `impl Send` instead of
|
|
// the hidden type. We already have obligations registered on the inference
|
|
// var to make it uphold the `: Duh` bound on `Trait::Assoc`. The opaque
|
|
// type does not implement `Duh`, even if its hidden type does.
|
|
// Lazy TAIT would error out, but we inserted a hack to make it work again,
|
|
// keeping backwards compatibility.
|
|
fn foo() -> impl Trait<Assoc = impl Send> {
|
|
|| 42
|
|
}
|
|
|
|
fn main() {
|
|
}
|