// FIXME(#96332): We should be able to suggest a fix and automatically fix. #![allow(dead_code)] mod foo { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait {} trait MyTrait { fn use_self(&self) -> &(); } trait Irrelevant {} impl MyTrait for dyn ObjectTrait { fn use_self(&self) -> &() { panic!() } } impl Irrelevant for dyn ObjectTrait {} fn use_it<'a, T>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a { val.use_self::() //~ ERROR borrowed data escapes } } mod bar { trait ObjectTrait {} trait MyTrait { fn use_self(&self) -> &(); } trait Irrelevant {} impl MyTrait for dyn ObjectTrait { fn use_self(&self) -> &() { panic!() } } impl Irrelevant for dyn ObjectTrait {} fn use_it<'a>(val: &'a dyn ObjectTrait) -> &'a () { val.use_self() } } mod baz { trait ObjectTrait {} trait MyTrait { fn use_self(&self) -> &(); } trait Irrelevant {} impl MyTrait for Box { fn use_self(&self) -> &() { panic!() } } impl Irrelevant for Box {} fn use_it<'a>(val: &'a Box) -> &'a () { val.use_self() } } mod bat { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait {} impl dyn ObjectTrait { fn use_self(&self) -> &() { panic!() } } fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a { val.use_self() //~^ ERROR borrowed data escapes } } mod ban { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait {} trait MyTrait { fn use_self(&self) -> &() { panic!() } } trait Irrelevant { fn use_self(&self) -> &() { panic!() } } impl MyTrait for dyn ObjectTrait {} fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> { val.use_self() //~ ERROR borrowed data escapes } } mod bal { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait {} trait MyTrait { fn use_self(&self) -> &() { panic!() } } trait Irrelevant { fn use_self(&self) -> &() { panic!() } } impl MyTrait for dyn ObjectTrait {} impl Irrelevant for dyn ObjectTrait {} fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a { MyTrait::use_self(val) //~ ERROR borrowed data escapes } } fn main() {}