Closed
Description
I tried this code:
struct Bar {}
lazy_static::lazy_static! {
static ref FOO: [Bar; 1] = [
Bar{}
];
}
fn main() {
let _ = FOO.into_iter();
}
I expected to see this happen: array_into_iter
should fire for this. Or, maybe this shouldn't fail in 2021?
Instead, this happened: Lint does not fire. When migrating to 2021, this fails to compile:
error[E0508]: cannot move out of type `[Bar; 1]`, a non-copy array
--> src/main.rs:10:13
|
10 | let _ = FOO.into_iter();
| ^^^
| |
| cannot move out of here
| move occurs because value has type `[Bar; 1]`, which does not implement the `Copy` trait
lazy_static
uses a Deref to access the underlying value. The expanded code looks like this:
struct FOO {
__private_field: (),
}
#[doc(hidden)]
static FOO: FOO = FOO {
__private_field: (),
};
impl ::lazy_static::__Deref for FOO {
type Target = [Bar; 1];
fn deref(&self) -> &[Bar; 1] {
#[inline(always)]
fn __static_ref_initialize() -> [Bar; 1] {
[Bar {}]
}
#[inline(always)]
fn __stability() -> &'static [Bar; 1] {
static LAZY: ::lazy_static::lazy::Lazy<[Bar; 1]> = ::lazy_static::lazy::Lazy::INIT;
LAZY.get(__static_ref_initialize)
}
__stability()
}
}
impl ::lazy_static::LazyStatic for FOO {
fn initialize(lazy: &Self) {
let _ = &**lazy;
}
}
I don't know if it is feasible to have a fix suggestion for this, or why exactly the existing lint doesn't fire.
Meta
rustc --version --verbose
:
rustc 1.56.0-nightly (8007b506a 2021-08-14)
binary: rustc
commit-hash: 8007b506ac5da629f223b755f5a5391edd5f6d01
commit-date: 2021-08-14
host: x86_64-apple-darwin
release: 1.56.0-nightly
LLVM version: 12.0.1