Skip to content

Warn against calls which mutate an interior mutable const-item#148407

Merged
bors merged 5 commits intorust-lang:mainfrom
Urgau:suspicious_int_mutable_consts
Nov 22, 2025
Merged

Warn against calls which mutate an interior mutable const-item#148407
bors merged 5 commits intorust-lang:mainfrom
Urgau:suspicious_int_mutable_consts

Conversation

@Urgau
Copy link
Copy Markdown
Member

@Urgau Urgau commented Nov 2, 2025

const_item_interior_mutations

interior_mutable_const_item_mutations

suspicious_mutation_of_interior_mutable_consts

warn-by-default

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");
    });
}
warning: mutation of an interior mutable `const` item with call to `call_once`
  --> a.rs:11:5
   |
11 |       INIT.call_once(|| {
   |       ^---
   |       |
   |  _____`INIT` is a interior mutable `const` item of type `std::sync::Once`
   | |
12 | |         println!("Once::call_once first call");
13 | |     });
   | |______^
   |
   = note: each usage of a `const` item creates a new temporary
   = note: only the temporaries and never the original `const INIT` will be modified
   = help: for more details on interior mutability see <https://doc.rust-lang.org/reference/interior-mutability.html>
   = note: `#[warn(const_item_interior_mutations)]` on by default
help: for a shared instance of `INIT`, consider making it a `static` item instead
   |
 6 - const INIT: Once = Once::new(); // using `INIT` will always create a temporary and
 6 + static INIT: Once = Once::new(); // using `INIT` will always create a temporary and
   |

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 and may be extended in the future.


This PR is an targeted alternative to #132146. It avoids false-positives by adding an internal-only attribute #[rustc_should_not_be_called_on_const_items] on methods and functions that mutates an interior mutale type through a shared reference (mutable refrences are already linted by the const_item_mutation lint).

It should also be noted that this is NOT an uplift of the more general clippy::borrow_interior_mutable_const lint, which is a much more general lint regarding borrow of interior mutable types, but has false-positives that are completly avoided by this lint.

A simple GitHub Search reveals many instance where the user probably wanted to use a static-item instead.


@rustbot labels +I-lang-nominated +T-lang
cc @traviscross
r? compiler

Fixes IRLO - Forbidding creation of constant mutexes, etc
Fixes #132028
Fixes #40543

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. I-lang-radar Items that are on lang's radar and will need eventual work or consideration. needs-fcp This change is insta-stable, or significant enough to need a team FCP to proceed. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-clippy Relevant to the Clippy team. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-lang Relevant to the language team to-announce Announce this issue on triage meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Silent failure of std::sync::Once when in const variable Produce a warning when using const with interior mutability