-
-
Notifications
You must be signed in to change notification settings - Fork 14.2k
Description
Using the latest stable compiler(1.27) (and probably earlier ones too) given the snippet:
#![deny(elided_lifetimes_in_paths)]
struct Bar<'a> {
a: &'a i32,
}
fn main() {
let bar = Bar::<'_> {a: &42};
}we get the error:
error: hidden lifetime parameters are deprecated, try `Foo<'_>`
--> src/main.rs:8:21
|
8 | let bar = Bar::<'_> {a: &42};
| ^^
|
note: lint level defined here
--> src/main.rs:1:9
|
1 | #![deny(elided_lifetimes_in_paths)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous errorThis makes no sense, both because the name Foo is constant in the error message, and both because the lifetime parameter suggested doesn't fix anything. (again, because the error message is just a constant)
https://doc.rust-lang.org/nightly/nightly-rustc/rustc/lint/builtin/static.ELIDED_LIFETIMES_IN_PATHS.html
Note, this does compile:
#![deny(elided_lifetimes_in_paths)]
struct Bar<'a> {
a: &'a i32,
}
fn fun<'a>() {
let bar = Bar::<'a> {a: &42};
}
fn main() {
fun();
}but since main can't have any lifetime parameters, Bar can no be initialized directly in main, and fun is defined with a lifetime parameter that is only used internally, rather than giving any information about how the function is to be used.
while experimenting with the same code, THIS COMPILED:
// #![deny(elided_lifetimes_in_paths)] // Note this is commented out, as in, unrelated
struct Foo {
a: i32
}
struct Bar<'a> {
a: &'a Foo,
}
fn fun<'a>() -> Bar<'a> {
let bar = Bar::<'a> {a: &Foo{a: 42}};
bar
}
fn main() {
fun();
}EDIT: This last example compiles because of the "rvalue static promotion" feature, which i was not aware of when opening the issue. Had that Foo been a mutable local variable, this would correctly fail. Learn something new every day :)
See also #51903.