Closed
Description
Given the following code: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3d9d42dd1968a2f14a49b84c6a39300c
struct Wrapper<'a, T: ?Sized>(&'a T);
trait Project {
type Projected<'a> where Self: 'a;
fn project(this: Wrapper<'_, Self>) -> Self::Projected<'_>;
}
trait MyTrait {}
trait ProjectedMyTrait {}
impl<T> Project for Option<T> {
type Projected<'a> = Option<Wrapper<'a, T>> where T: 'a;
fn project(this: Wrapper<'_, Self>) -> Self::Projected<'_> {
this.0.as_ref().map(Wrapper)
}
}
impl<T: MyTrait> MyTrait for Option<Wrapper<'_, T>> {}
impl<T: ProjectedMyTrait> MyTrait for Wrapper<'_, T> {}
impl<T> ProjectedMyTrait for T
where
T: Project,
for<'a> T::Projected<'a>: MyTrait,
{}
fn require_trait(_: impl MyTrait) {}
fn foo<T: MyTrait>(wrap: Wrapper<'_, Option<T>>) {
require_trait(wrap)
}
The current output is:
error: `T` does not live long enough
--> src/lib.rs:31:5
|
31 | require_trait(wrap)
| ^^^^^^^^^^^^^^^^^^^
Ideally the output would somehow point out that part of the cause is the for <'a>
clause essentially leading to a T: 'static
requirement.
When I encountered this error, the relevant for<'a>
and GAT trait implementation were not nearby so it was very difficult to tell what the issue was.