-
-
Notifications
You must be signed in to change notification settings - Fork 14.2k
Description
With #3511 landed, the lifetime of bytes!() is now problematic. Specifically, the following used to work and now fails:
let b = match true {
true => bytes!("test"),
false => unreachable!()
};The lifetime of bytes!("test") is now limited to that branch of the match, so it doesn't live long enough to be assigned to b.
I'm not sure if this means lifetimes need to change. The other option is that bytes!() needs to return a &'static [u8]. Unfortunately, the only way to do that right now is to make it equivalent to {static b: &'static [u8] = &[...]; b }, which makes it no longer usable as the value of a constant (e.g. static foo: &'static [u8] = bytes!("foo")).
I'm thinking the right solution is to make it legal for me to say &'static [1u8]. I can type that right now, but the 'static lifetime seems to be wholly ignored, as I get the exact same error with the following as I do with the bytes!() example above:
let b = match true {
true => &'static [1u8],
false => unreachable!()
};If &'static [1u8] becomes a valid expression with the 'static lifetime, then bytes!() could start evaluating to that and everything should work as expected. Furthermore, it would be nice (but perhaps not required) if &[1u8], where all elements are compile-time constants, would implicitly be given the 'static lifetime.