45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
//@ run-pass
|
|
//@ revisions: mir codegen
|
|
//@[mir] compile-flags: -Zmir-opt-level=3
|
|
//@[codegen] compile-flags: -Zmir-opt-level=0
|
|
|
|
// A regression test for #107205
|
|
#![allow(coherence_leak_check)]
|
|
struct Foo<T: 'static>(T);
|
|
|
|
fn useful<'a>(_: &'a u8) {}
|
|
|
|
trait GetInner {
|
|
type Assoc;
|
|
fn muahaha(&mut self) -> Self::Assoc;
|
|
}
|
|
|
|
impl GetInner for Foo<fn(&'static u8)> {
|
|
type Assoc = String;
|
|
fn muahaha(&mut self) -> String {
|
|
String::from("I am a string")
|
|
}
|
|
}
|
|
|
|
impl GetInner for Foo<for<'a> fn(&'a u8)> {
|
|
type Assoc = [usize; 3];
|
|
fn muahaha(&mut self) -> [usize; 3] {
|
|
[100; 3]
|
|
}
|
|
}
|
|
|
|
fn break_me(hr_fnptr: Box<Foo::<for<'a> fn(&'a u8)>>) -> Box<dyn GetInner<Assoc = String>> {
|
|
let lr_fnptr = hr_fnptr as Box<Foo<fn(&'static u8)>>;
|
|
lr_fnptr as Box<dyn GetInner<Assoc = String>>
|
|
}
|
|
|
|
fn main() {
|
|
drop(Box::new(Foo(useful as fn(&'static u8))) as Box<dyn GetInner<Assoc = String>>);
|
|
drop(Box::new(Foo(useful as fn(&u8))) as Box<dyn GetInner<Assoc = [usize; 3]>>);
|
|
|
|
let mut any = break_me(Box::new(Foo(useful)));
|
|
|
|
let evil_string = any.muahaha();
|
|
assert_eq!(evil_string, "I am a string");
|
|
}
|