Skip to content

Borrow checker error on nightly even when the type is 'static #106332

Closed
@NobodyXu

Description

@NobodyXu

Compiling the binstalk from cargo-bins/cargo-binstall#646 failed on nightly due to lifetime error while it works on stable.

The code in question looks like this and is in taken from crates/binstalk/src/fetchers/gh_crate_meta.rs

pub struct GhCrateMeta {
    client: Client,
    data: Arc<Data>,
    target_data: Arc<TargetData>,
    resolution: OnceCell<(Url, PkgFmt)>,
}

type FindTaskRes = Result<Option<(Url, PkgFmt)>, BinstallError>;

impl GhCrateMeta {
    fn launch_baseline_find_tasks<'a>(
        &'a self,
        pkg_fmt: PkgFmt,
        pkg_url: &'a str,
        repo: Option<&'a str>,
    ) -> impl Iterator<Item = impl Future<Output = FindTaskRes> + 'static> + 'a {
        todo!()
    }

    fn find(self: Arc<Self>) -> AutoAbortJoinHandle<Result<bool, BinstallError>> {
        AutoAbortJoinHandle::spawn(async move {
            // ...
            let mut handles = FuturesUnordered::new();

            // Iterate over pkg_urls to avoid String::clone.
            for pkg_url in pkg_urls {
                //             Clone iter pkg_fmts to ensure all pkg_fmts is
                //             iterated over for each pkg_url, which is
                //             basically cartesian product.
                //             |
                for pkg_fmt in pkg_fmts.clone() {
                    handles.extend(this.launch_baseline_find_tasks(pkg_fmt, &pkg_url, repo));
                }
            }

            todo!()
        })
    }

On nightly, this failed with:

error[E0597]: `pkg_url` does not live long enough
   --> crates/binstalk/src/fetchers/gh_crate_meta.rs:147:77
    |
147 |                     handles.extend(this.launch_baseline_find_tasks(pkg_fmt, &pkg_url, repo));
    |                                                                             ^^^^^^^^ borrowed value 
does not live long enough
148 |                 }
149 |             }
    |             - `pkg_url` dropped here while still borrowed
...
160 |         })
    |         - borrow might be used here, when `handles` is dropped and runs the `Drop` code for type `Fu
turesUnordered`
    |
    = note: values in a scope are dropped in the opposite order they are defined

For more information about this error, try `rustc --explain E0597`.
error: could not compile `binstalk` due to previous error
warning: build failed, waiting for other jobs to finish...
error: could not compile `binstalk` due to previous error

Meta

rustc +nightly --version --verbose:

rustc 1.68.0-nightly (ce85c9857 2022-12-30)
binary: rustc
commit-hash: ce85c98575e3016cf2007d90a85be321e592aa96
commit-date: 2022-12-30
host: aarch64-apple-darwin
release: 1.68.0-nightly
LLVM version: 15.0.6

Metadata

Metadata

Assignees

Labels

C-bugCategory: This is a bug.E-needs-mcveCall for participation: This issue has a repro, but needs a Minimal Complete and Verifiable ExampleP-highHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-betaPerformance or correctness regression from stable to beta.

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions