Repository: rust
Issue: Adding explicit lifetimes causes compilation error
Labels: A-lifetimes,A-async-await,C-discussion

Compiler version 1.81.0.

I am writing an asynchronous function that takes asynchronous callback, I managed to write it so that it compiles:
```rust
pub trait Callback<State> {
    type Output: Future<Output = ()>;

    fn call(&self, state: State) -> Self::Output;
}

impl<State, F, Fut> Callback<State> for F
where
    F: Fn(State) -> Fut,
    Fut: Future<Output = ()>,
{
    type Output = Fut;

    fn call(&self, state: State) -> Self::Output {
        self(state)
    }
}

pub async fn aaa<State, Cb>(state: &mut State, callback: &Cb)
where
    for<'state> Cb: Callback<&'state mut State>,
{
}

pub async fn bbb<State, Cb>(state: &mut State) {
    async fn callback<State>(state: &mut State) {}
    aaa(state, &callback).await;
}
```

However, if I try to add explicit lifetimes to the Callback trait, I get compilation error:
```
error[E0309]: the parameter type `State` may not live long enough
   --> src/storage.rs:252:33
    |
250 | impl<'state, State, F, Fut> Callback<'state, State> for F
    |      ------ the parameter type `State` must be valid for the lifetime `'state` as defined here...
251 | where
252 |     F: Fn(&'state mut State) -> Fut,
    |                                 ^^^ ...so that the reference type `&'state mut State` does not outlive the data it points at
    |
help: consider adding an explicit lifetime bound
    |
250 | impl<'state, State: 'state, F, Fut> Callback<'state, State> for F
    |                   ++++++++
```
for the following code:
```rust
pub trait Callback<'state, State> {
    type Output: Future<Output = ()>;

    fn call(&self, state: &'state mut State) -> Self::Output;
}

impl<'state, State, F, Fut> Callback<'state, State> for F
where
    F: Fn(&'state mut State) -> Fut,
    Fut: Future<Output = ()>,
{
    type Output = Fut;

    fn call(&self, state: &'state mut State) -> Self::Output {
        self(state)
    }
}

pub async fn aaa<State, Cb>(state: &mut State, callback: &Cb)
where
    for<'state> Cb: Callback<'state, State>,
{
}

pub async fn bbb<State, Cb>(state: &mut State) {
    async fn callback<State>(state: &mut State) {}
    aaa(state, &callback).await;
}
```

But if I fix it according to the suggestion, I get the following error:
```
error[E0310]: the parameter type `State` may not live long enough
   --> src/storage.rs:270:5
    |
270 |     aaa(state, &callback).await;
    |     ^^^^^^^^^^^^^^^^^^^^^
    |     |
    |     the parameter type `State` must be valid for the static lifetime...
    |     ...so that the type `State` will meet its required lifetime bounds
    |
help: consider adding an explicit lifetime bound
    |
268 | pub async fn bbb<State: 'static, Cb>(state: &mut State) {
    |                       +++++++++

error[E0310]: the parameter type `State` may not live long enough
   --> src/storage.rs:270:27
    |
270 |     aaa(state, &callback).await;
    |                           ^^^^^
    |                           |
    |                           the parameter type `State` must be valid for the static lifetime...
    |                           ...so that the type `State` will meet its required lifetime bounds
    |
help: consider adding an explicit lifetime bound
    |
268 | pub async fn bbb<State: 'static, Cb>(state: &mut State) {
    |                       +++++++++
```
for the code
```rust
pub trait Callback<'state, State> {
    type Output: Future<Output = ()>;

    fn call(&self, state: &'state mut State) -> Self::Output;
}

impl<'state, State: 'state, F, Fut> Callback<'state, State> for F
where
    F: Fn(&'state mut State) -> Fut,
    Fut: Future<Output = ()>,
{
    type Output = Fut;

    fn call(&self, state: &'state mut State) -> Self::Output {
        self(state)
    }
}

pub async fn aaa<State, Cb>(state: &mut State, callback: &Cb)
where
    for<'state> Cb: Callback<'state, State>,
{
}

pub async fn bbb<State, Cb>(state: &mut State) {
    async fn callback<State>(state: &mut State) {}
    aaa(state, &callback).await;
}
```

I thing something is not correct about treating explicit lifetimes by the compiler, or I added the lifetimes incorrectly.
Please help.