// FIXME: the following cases need to suggest more things to make users reach a working end state. mod bav { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait { type Assoc: Bar; } trait MyTrait { fn use_self(&self) -> &() { panic!() } } trait Bar {} impl MyTrait for Box> { fn use_self(&self) -> &() { panic!() } } impl Bar for i32 {} fn use_it<'a>(val: Box>) -> impl OtherTrait<'a> { val.use_self() //~ ERROR cannot return value referencing function parameter } } mod bap { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait { type Assoc: Bar; } trait MyTrait { fn use_self(&self) -> &() { panic!() } } trait Bar {} impl MyTrait for Box> { fn use_self(&self) -> &() { panic!() } } impl Bar for i32 {} fn use_it<'a>(val: Box>) -> impl OtherTrait<'a> + 'a { val.use_self() //~ ERROR E0515 } } // This case in particular requires the user to write all of the bounds we have in `mod bax`. mod bay { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait { type Assoc: Bar; } trait MyTrait { fn use_self(&self) -> &() { panic!() } } trait Bar {} impl MyTrait for Box> { fn use_self(&self) -> &() { panic!() } } impl Bar for i32 {} fn use_it<'a>(val: Box + 'a>) -> &'a () { val.use_self() //~^ ERROR: cannot return value referencing function parameter `val` //~| ERROR: borrowed data escapes outside of function } } mod bax { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait { type Assoc: Bar; } trait MyTrait<'a> { fn use_self(&'a self) -> &'a () { panic!() } } trait Bar {} impl<'a> MyTrait<'a> for Box + 'a> { fn use_self(&'a self) -> &'a () { panic!() } } impl Bar for i32 {} fn use_it<'a>(val: Box + 'a>) -> &'a () { val.use_self() //~^ ERROR: cannot return value referencing function parameter `val` } } mod baw { trait OtherTrait<'a> {} impl<'a> OtherTrait<'a> for &'a () {} trait ObjectTrait { type Assoc: Bar; } trait MyTrait { fn use_self(&self) -> &() { panic!() } } trait Bar {} impl<'a> MyTrait for Box>> { fn use_self(&self) -> &() { panic!() } } fn use_it<'a>(val: Box>>) -> impl OtherTrait<'a> + 'a{ val.use_self() //~ ERROR E0515 } } fn main() {}