// edition:2018 // This test checks that we emit the correct borrowck error when `Self` or a projection is used as // a return type. See #61949 for context. mod with_self { pub struct Foo<'a> { pub bar: &'a i32, } impl<'a> Foo<'a> { pub fn new(_bar: &'a i32) -> impl Into { Foo { bar: &22 } } } fn foo() { let x = { let bar = 22; Foo::new(&bar).into() //~^ ERROR `bar` does not live long enough }; drop(x); } } struct Foo(T); trait FooLike { type Output; } impl FooLike for Foo { type Output = T; } mod impl_trait { use super::*; trait Trait { type Assoc; fn make_assoc(self) -> Self::Assoc; } /// `T::Assoc` can't be normalized any further here. fn foo(x: T) -> impl FooLike { Foo(x.make_assoc()) } impl<'a> Trait for &'a () { type Assoc = &'a (); fn make_assoc(self) -> &'a () { &() } } fn usage() { let x = { let y = (); foo(&y) //~^ ERROR `y` does not live long enough }; drop(x); } } // Same with lifetimes in the trait mod lifetimes { use super::*; trait Trait<'a> { type Assoc; fn make_assoc(self) -> Self::Assoc; } /// Missing bound constraining `Assoc`, `T::Assoc` can't be normalized further. fn foo<'a, T: Trait<'a>>(x: T) -> impl FooLike { Foo(x.make_assoc()) } impl<'a> Trait<'a> for &'a () { type Assoc = &'a (); fn make_assoc(self) -> &'a () { &() } } fn usage() { let x = { let y = (); foo(&y) //~^ ERROR `y` does not live long enough }; drop(x); } } fn main() { }