| #![feature(type_alias_impl_trait)] | |
| use std::fmt::Display; | |
| type Opaque<X> = impl Sized + 'static; | |
| #[define_opaque(Opaque)] | |
| fn define<X>() -> Opaque<X> {} | |
| trait Trait { | |
| type Assoc: Display; | |
| } | |
| impl<'a> Trait for Opaque<&'a str> { | |
| //~^ ERROR the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates | |
| type Assoc = &'a str; | |
| } | |
| // ======= Exploit ======= | |
| fn extend<T: Trait + 'static>(s: T::Assoc) -> Box<dyn Display> { | |
| Box::new(s) | |
| } | |
| fn main() { | |
| let val = extend::<Opaque<&'_ str>>(&String::from("blah blah blah")); | |
| println!("{}", val); | |
| } |