mirror of https://github.com/rust-lang/rust
39 lines
924 B
Rust
39 lines
924 B
Rust
// A regression test for #97156
|
|
|
|
type One = for<'a> fn(&'a (), &'a ());
|
|
type Two = for<'a, 'b> fn(&'a (), &'b ());
|
|
|
|
mod my_api {
|
|
use std::any::Any;
|
|
use std::marker::PhantomData;
|
|
|
|
pub struct Foo<T: 'static> {
|
|
a: &'static dyn Any,
|
|
_p: PhantomData<*mut T>, // invariant, the type of the `dyn Any`
|
|
}
|
|
|
|
impl<T: 'static> Foo<T> {
|
|
pub fn deref(&self) -> &'static T {
|
|
match self.a.downcast_ref::<T>() {
|
|
None => unsafe { std::hint::unreachable_unchecked() },
|
|
Some(a) => a,
|
|
}
|
|
}
|
|
|
|
pub fn new(a: T) -> Foo<T> {
|
|
Foo::<T> { a: Box::leak(Box::new(a)), _p: PhantomData }
|
|
}
|
|
}
|
|
}
|
|
|
|
use my_api::*;
|
|
|
|
fn main() {
|
|
let foo = Foo::<One>::new((|_, _| ()) as One);
|
|
foo.deref();
|
|
let foo: Foo<Two> = foo;
|
|
//~^ ERROR mismatched types [E0308]
|
|
//~| ERROR mismatched types [E0308]
|
|
foo.deref();
|
|
}
|