2022-04-01 12:13:25 -05:00
|
|
|
// FIXME(#96332): We should be able to suggest a fix and automatically fix.
|
2022-05-22 00:36:12 -05:00
|
|
|
|
2020-06-26 20:52:00 -05:00
|
|
|
#![allow(dead_code)]
|
|
|
|
|
|
|
|
mod foo {
|
|
|
|
trait OtherTrait<'a> {}
|
|
|
|
impl<'a> OtherTrait<'a> for &'a () {}
|
|
|
|
|
2020-06-30 19:41:15 -05:00
|
|
|
trait ObjectTrait<T> {}
|
|
|
|
trait MyTrait<T> {
|
|
|
|
fn use_self<K>(&self) -> &();
|
2020-06-26 20:52:00 -05:00
|
|
|
}
|
2020-06-28 17:26:12 -05:00
|
|
|
trait Irrelevant {}
|
2020-06-26 20:52:00 -05:00
|
|
|
|
2020-06-30 19:41:15 -05:00
|
|
|
impl<T> MyTrait<T> for dyn ObjectTrait<T> {
|
|
|
|
fn use_self<K>(&self) -> &() { panic!() }
|
2020-06-26 20:52:00 -05:00
|
|
|
}
|
2020-06-30 19:41:15 -05:00
|
|
|
impl<T> Irrelevant for dyn ObjectTrait<T> {}
|
2020-06-26 20:52:00 -05:00
|
|
|
|
2020-06-30 19:41:15 -05:00
|
|
|
fn use_it<'a, T>(val: &'a dyn ObjectTrait<T>) -> impl OtherTrait<'a> + 'a {
|
2022-04-01 12:13:25 -05:00
|
|
|
val.use_self::<T>() //~ ERROR borrowed data escapes
|
2020-06-26 20:52:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mod bar {
|
|
|
|
trait ObjectTrait {}
|
|
|
|
trait MyTrait {
|
|
|
|
fn use_self(&self) -> &();
|
|
|
|
}
|
2020-06-28 17:26:12 -05:00
|
|
|
trait Irrelevant {}
|
2020-06-26 20:52:00 -05:00
|
|
|
|
|
|
|
impl MyTrait for dyn ObjectTrait {
|
|
|
|
fn use_self(&self) -> &() { panic!() }
|
|
|
|
}
|
2020-06-28 17:26:12 -05:00
|
|
|
impl Irrelevant for dyn ObjectTrait {}
|
2020-06-26 20:52:00 -05:00
|
|
|
|
|
|
|
fn use_it<'a>(val: &'a dyn ObjectTrait) -> &'a () {
|
2022-04-01 12:13:25 -05:00
|
|
|
val.use_self()
|
2020-06-26 20:52:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-28 17:26:12 -05:00
|
|
|
mod baz {
|
|
|
|
trait ObjectTrait {}
|
|
|
|
trait MyTrait {
|
|
|
|
fn use_self(&self) -> &();
|
|
|
|
}
|
|
|
|
trait Irrelevant {}
|
|
|
|
|
|
|
|
impl MyTrait for Box<dyn ObjectTrait> {
|
|
|
|
fn use_self(&self) -> &() { panic!() }
|
|
|
|
}
|
|
|
|
impl Irrelevant for Box<dyn ObjectTrait> {}
|
|
|
|
|
|
|
|
fn use_it<'a>(val: &'a Box<dyn ObjectTrait + 'a>) -> &'a () {
|
2022-04-01 12:13:25 -05:00
|
|
|
val.use_self()
|
2020-06-28 17:26:12 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2022-04-01 12:13:25 -05:00
|
|
|
val.use_self()
|
|
|
|
//~^ ERROR borrowed data escapes
|
2020-06-28 17:26:12 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-29 13:14:42 -05:00
|
|
|
mod ban {
|
|
|
|
trait OtherTrait<'a> {}
|
|
|
|
impl<'a> OtherTrait<'a> for &'a () {}
|
|
|
|
|
|
|
|
trait ObjectTrait {}
|
|
|
|
trait MyTrait {
|
2020-06-30 19:41:15 -05:00
|
|
|
fn use_self(&self) -> &() { panic!() }
|
2020-06-29 13:14:42 -05:00
|
|
|
}
|
2020-07-01 16:02:57 -05:00
|
|
|
trait Irrelevant {
|
|
|
|
fn use_self(&self) -> &() { panic!() }
|
|
|
|
}
|
2020-06-29 13:14:42 -05:00
|
|
|
|
2020-06-30 19:41:15 -05:00
|
|
|
impl MyTrait for dyn ObjectTrait {}
|
2020-06-29 13:14:42 -05:00
|
|
|
|
|
|
|
fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> {
|
2022-04-01 12:13:25 -05:00
|
|
|
val.use_self() //~ ERROR borrowed data escapes
|
2020-06-29 13:14:42 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-01 16:02:57 -05:00
|
|
|
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 {
|
2022-04-01 12:13:25 -05:00
|
|
|
MyTrait::use_self(val) //~ ERROR borrowed data escapes
|
2020-07-01 16:02:57 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-26 20:52:00 -05:00
|
|
|
fn main() {}
|