Since https://github.com/rust-lang/rust/pull/67160 has been merged in December, having a GAT with lifetimes should be possible (See the `StreamingIterator` example in that PR). The current trait-defition of a coroutine is the following: ```rust pub trait Coroutine<R = ()> { type Yield; type Return; fn resume( self: Pin<&mut Self>, arg: R ) -> CoroutineState<Self::Yield, Self::Return>; } ``` The issue here is that the `Yield` can't be parameterized with a lifetime, so yielding a reference from a coroutine is not possible in its current state. By using a GAT for the `Yield` AT, it would be possible to return a local reference. I also don't see why the resume argument type could not have been expressed with a GAT, so at the end we would use the following trait definition for a coroutine: ```rust pub trait Coroutine { type Resume<'a>; type Yield<'a>; type Return; fn resume<'a, 'b>( self: Pin<&'a mut Self>, arg: Self::Resume<'b> ) -> CoroutineState<Self::Yield<'a>, Self::Return>; } ```