// Another example from issue #84660, this time weaponized as a safe transmute: an opaque type in an // impl header being accepted was used to create unsoundness. #![feature(type_alias_impl_trait)] trait Foo {} impl Foo for () {} type Bar = impl Foo; fn _defining_use() -> Bar {} trait Trait { type Out; fn convert(i: In) -> Self::Out; } impl Trait for Out { type Out = Out; fn convert(_i: In) -> Self::Out { unreachable!(); } } impl Trait<(), In> for Out { //~ ERROR conflicting implementations of trait `Trait` type Out = In; fn convert(i: In) -> Self::Out { i } } fn transmute(i: In) -> Out { >::convert(i) } fn main() { let d; { let x = "Hello World".to_string(); d = transmute::<&String, &String>(&x); } println!("{}", d); }