| // 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<dyn ObjectTrait<Assoc = i32>> { | |
| fn use_self(&self) -> &() { panic!() } | |
| } | |
| impl Bar for i32 {} | |
| fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> 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<dyn ObjectTrait<Assoc = i32>> { | |
| fn use_self(&self) -> &() { panic!() } | |
| } | |
| impl Bar for i32 {} | |
| fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32>>) -> 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<dyn ObjectTrait<Assoc = i32>> { | |
| fn use_self(&self) -> &() { panic!() } | |
| } | |
| impl Bar for i32 {} | |
| fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + '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<dyn ObjectTrait<Assoc = i32> + 'a> { | |
| fn use_self(&'a self) -> &'a () { panic!() } | |
| } | |
| impl Bar for i32 {} | |
| fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + '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<dyn ObjectTrait<Assoc = Box<dyn Bar>>> { | |
| fn use_self(&self) -> &() { panic!() } | |
| } | |
| fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = Box<dyn Bar>>>) -> impl OtherTrait<'a> + 'a{ | |
| val.use_self() //~ ERROR E0515 | |
| } | |
| } | |
| fn main() {} |