- 
                Notifications
    
You must be signed in to change notification settings  - Fork 13.9k
 
Closed
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
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.
Metadata
Metadata
Assignees
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.