Spurious "does not live long enough" for closure coerced to fn pointer in static item (AST borrowck only) #48540
Closed
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