mirror of https://github.com/rust-lang/rust.git
33 lines
1003 B
Rust
33 lines
1003 B
Rust
//@ build-pass
|
|
|
|
// Regression test for <https://github.com/rust-lang/rust/issues/139812>.
|
|
|
|
// Make sure that the unsize coercion we collect in mono for `Signal<i32> -> Signal<dyn Any>`
|
|
// doesn't choke on the fact that the inner unsized field of `Signal<T>` is a (trivial) alias.
|
|
// This exercises a normalize call that is necessary since we're getting a type from the type
|
|
// system, which isn't guaranteed to be normalized after substitution.
|
|
|
|
#![feature(coerce_unsized)]
|
|
|
|
use std::ops::CoerceUnsized;
|
|
|
|
trait Mirror {
|
|
type Assoc: ?Sized;
|
|
}
|
|
impl<T: ?Sized> Mirror for T {
|
|
type Assoc = T;
|
|
}
|
|
|
|
trait Any {}
|
|
impl<T> Any for T {}
|
|
|
|
struct Signal<'a, T: ?Sized>(<&'a T as Mirror>::Assoc);
|
|
|
|
// This `CoerceUnsized` impl isn't special; it's a bit more restricted than we'd see in the wild,
|
|
// but this ICE also reproduces if we were to make it general over `Signal<T> -> Signal<U>`.
|
|
impl<'a> CoerceUnsized<Signal<'a, dyn Any>> for Signal<'a, i32> {}
|
|
|
|
fn main() {
|
|
Signal(&1i32) as Signal<dyn Any>;
|
|
}
|