Skip to content

Compile error: static lifetime not satisfied but it is #86172

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
Skepfyr opened this issue Jun 9, 2021 · 9 comments
Open

Compile error: static lifetime not satisfied but it is #86172

Skepfyr opened this issue Jun 9, 2021 · 9 comments
Labels
A-lifetimes Area: Lifetimes / regions C-bug Category: This is a bug. P-high High priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. WG-async Working group: Async & await

Comments

@Skepfyr
Copy link
Contributor

Skepfyr commented Jun 9, 2021

I tried this code:

use std::{
    future::Future,
    marker::PhantomData,
    {pin::Pin, sync::Arc},
};

fn validate_signature() -> impl Future<Output = ()> + Send {
    let certificate_store = Cache::<CertificateRetriever>::new();
    let res = Box::pin(async move {
        certificate_store.get().await;
    });
    fn foo<T: 'static>(_c: &T) {}
    res
}

type CertificateRetriever =
    Arc<dyn Retrieve<Future = Pin<Box<dyn Future<Output = ()> + Send + 'static>>>>;

trait Retrieve: Send + Sync {
    type Future: Future<Output = ()> + Send + 'static;

    fn get(&self) -> Self::Future;
}

impl<R: Retrieve + ?Sized> Retrieve for Arc<R> {
    type Future = R::Future;

    fn get(&self) -> Self::Future {
        todo!()
    }
}

struct Cache<R: Retrieve> {
    marker: PhantomData<R>,
}

impl<R> Cache<R>
where
    R: Retrieve + 'static,
{
    fn new() -> Self {
        todo!()
    }
    async fn get(&self) {
        self.get_value().await
    }

    fn get_value(&self) -> R::Future {
        todo!()
    }
}

Playground

I expected to see this to compile fine, minor changes to the code cause it to compile.

Instead, I get this error:

error[E0477]: the type `Pin<Box<dyn Future<Output = ()> + Send>>` does not fulfill the required lifetime
 --> src/lib.rs:7:28
  |
7 | fn validate_signature() -> impl Future<Output = ()> + Send {
  |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: type must satisfy the static lifetime

error: aborting due to previous error

This may be a duplicate of #80052 but as it involves no associated constants I'm keeping it separate for now.
Compiled with rustc 1.52.1

@Skepfyr Skepfyr added the C-bug Category: This is a bug. label Jun 9, 2021
@inquisitivecrystal
Copy link
Contributor

@rustbot label +A-lifetimes +E-needs-mcve +T-compiler

@rustbot rustbot added A-lifetimes Area: Lifetimes / regions E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jun 9, 2021
@fee1-dead
Copy link
Member

fee1-dead commented Jun 13, 2021

I cannot minimize further:

use std::{future::Future, pin::Pin};

trait Foo: Send + Sync {
    type F: Future<Output = ()> + Send + 'static;
}

impl<R: Foo + ?Sized> Foo for Box<R> {
    type F = R::F;
}

fn a<R: Foo>() -> R::F { todo!() }
async fn b<R: Foo>() {
    a::<R>().await
}

fn c() -> impl Future<Output = ()> + Send {
    type A = Box<dyn Foo<F = Pin<Box<dyn Future<Output = ()> + Send + 'static>>>>;
    Box::pin(async {
        b::<A>().await;
    })
}

@rustbot label -E-needs-mcve

@rustbot rustbot removed the E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example label Jun 13, 2021
@Skepfyr
Copy link
Contributor Author

Skepfyr commented Jun 14, 2021

I bisected using the above repro to find the regression in nightly-2020-10-07.

cargo-bisect-rustc reports 6 bors merge commits:

Looking through those my best guess is that this is caused by #73905.

This suggests it is different from #80052 as I don't believe it has ever compiled, and it definitely works on both sides of this regression.

@inquisitivecrystal
Copy link
Contributor

inquisitivecrystal commented Jun 14, 2021

Ahh, another one. #73905 caused a lot of problems.

@rustbot label I-prioritize +regression-from-stable-to-stable

@rustbot rustbot added I-prioritize Issue: Indicates that prioritization has been requested for this issue. regression-from-stable-to-stable Performance or correctness regression from one stable version to another. labels Jun 14, 2021
@apiraino
Copy link
Contributor

Assigning priority as discussed in the Zulip thread of the Prioritization Working Group.

@rustbot label -I-prioritize +P-high

@rustbot rustbot added P-high High priority and removed I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels Jun 17, 2021
@compiler-errors
Copy link
Member

So removing the + Send makes the error go away -- this might be related to #71723 et al.

@pnkfelix
Copy link
Member

Visiting for P-high review

I recommend that this be first handed off to wg-async to investigate, with the advice that they in turn should feel free to hand it off again to T-types if they determine that this isn't really async/generator specific.

@pnkfelix pnkfelix added the WG-async Working group: Async & await label Nov 18, 2022
@matthewjasper
Copy link
Contributor

I've had a look at this and it's definitely another case of #71723, caused by the additional requirements for normalizing <dyn A<X=Y> as A>::X added in #73905

@RodBurman
Copy link

Compiling the minimal code (from Jun 13 2021) with version:

cargo 1.83.0 (5ffbef321 2024-10-29)
release: 1.83.0
commit-hash: 5ffbef3211a8c378857905775a15c5b32a174d3b
commit-date: 2024-10-29
host: aarch64-apple-darwin
libgit2: 1.8.1 (sys:0.19.0 vendored)
libcurl: 8.7.1 (sys:0.4.74+curl-8.9.0 system ssl:(SecureTransport) LibreSSL/3.3.6)
ssl: OpenSSL 1.1.1w  11 Sep 2023
os: Mac OS 15.2.0 [64-bit]

Yields:

   Compiling staticis v0.1.0 (/Users/rod/code/rust/triage/staticis)
error: higher-ranked lifetime error
  --> src/lib.rs:18:5
   |
18 | /     Box::pin(async {
19 | |         b::<A>().await;
20 | |     })
   | |______^

error: could not compile `staticis` (lib) due to 1 previous error

So the error remains and explanation is unusually terse for Rust which is usually much more helpful in its diagnostics.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-lifetimes Area: Lifetimes / regions C-bug Category: This is a bug. P-high High priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. WG-async Working group: Async & await
Projects
None yet
Development

No branches or pull requests

9 participants