Skip to content

array_into_iter does not fire for lazy_static arrays #88099

Closed
@ehuss

Description

@ehuss

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-edition-2021Area: The 2021 editionA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`C-bugCategory: This is a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions