CONST_ITEM_INTERIOR_MUTATIONS

Static CONST_ITEM_INTERIOR_MUTATIONS 

Source
pub static CONST_ITEM_INTERIOR_MUTATIONS: &Lint
Expand description

The const_item_interior_mutations lint checks for calls which mutates an interior mutable const-item.

§Example

use std::sync::Once;

const INIT: Once = Once::new(); // using `INIT` will always create a temporary and
                                // never modify it-self on use, should be a `static`
                                // instead for shared use

fn init() {
    INIT.call_once(|| {
        println!("Once::call_once first call");
    });
    INIT.call_once(|| {                          // this second will also print
        println!("Once::call_once second call"); // as each call to `INIT` creates
    });                                          // new temporary
}

{{produces}}

§Explanation

Calling a method which mutates an interior mutable type has no effect as const-item are essentially inlined wherever they are used, meaning that they are copied directly into the relevant context when used rendering modification through interior mutability ineffective across usage of that const-item.

The current implementation of this lint only warns on significant std and core interior mutable types, like Once, AtomicI32, … this is done out of prudence to avoid false-positive and may be extended in the future.