Skip to content

Spurious "does not live long enough" for closure coerced to fn pointer in static item (AST borrowck only) #48540

Closed
@SimonSapin

Description

The test case below is reduced from a phf map.

rustc 1.26.0-nightly (28a1e4f 2018-02-24) with -Z borrowck=mir: OK

Without any -Z flag: error below, even though I believe the program to be valid. But maybe it’s not worth fixing if MIR-based borrow-checking will become the default soon? CC @nikomatsakis

A work-around is to have the closure in an intermediate const item.

fn main() {}

struct Static<T: 'static>(&'static [T]);

static FOO: Static<fn(&u32) -> &u32> = Static(&[|x| x]);
error[E0597]: borrowed value does not live long enough
 --> a.rs:5:52
  |
5 | pub static FOO: Static<fn(&u32) -> &u32> = Static(&[|x| x]);
  |                                                    ^^^^^^^- temporary value only lives until here
  |                                                    |
  |                                                    temporary value does not live long enough
  |
  = note: borrowed value must be valid for the static lifetime...

error: aborting due to previous error
fn main() {}

struct Static<T: 'static>(&'static [T]);

static FOO: Static<fn(&u32) -> &u32> = Static(&[
    {
        const F: fn(&u32) -> &u32 = |x| x;  // work around
        F
    },
]);

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    A-borrow-checkerArea: The borrow checkerC-enhancementCategory: An issue proposing an enhancement or a PR with one.T-langRelevant to the language team, which will review and decide on the PR/issue.fixed-by-NLLBugs fixed, but only when NLL is enabled.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions