Description
This is a tracking issue for the elided_lifetimes_in_associated_constant
future-incompatibility lint.
The goal of this page is describe why this change was made and how you can fix code that is affected by it. It also provides a place to ask questions or register a complaint if you feel the change should not be made. For more information on the policy around future-compatibility warnings, see our breaking change policy guidelines.
What
The elided_lifetimes_in_associated_constant
lint detects elided lifetimes that became erroneously allowed in associated constants after #97313.
struct Foo<'f>(&'f ());
impl Foo<'_> {
const STR: &str = "hello, world";
}
They current desugar to fresh early-bound lifetimes on the parent impl, like:
struct Foo<'f>(&'f ());
impl<'__a> Foo<'_> {
const STR: &'__a str = "hello, world";
}
This is in contrast to the way that elided lifetimes are treated in item-level consts (where elided lifetimes are resolved to 'static
), and this behavior was also never formally decided -- static-in-const lifetime rules do not apply to associated consts (rust-lang/rfcs#1623 (comment), #38831 (comment)).
Why
It was never decided what to do with elided lifetimes in consts, and it is not clear that the current behavior is optimal here. This is to stop the leaking by making sure existing elided lifetimes are fixed back to using 'static
as they were required to before version 1.64, and that new usages of elided lifetimes in consts are not introduced.
How to fix
Replace the elided lifetimes with 'static
(or manually introduce or reference another lifetime):
struct Foo;
impl Foo {
const STR: &'static str = "hello, world";
}