Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::mut_range_bound: attempt to mutate range bound within loop
What it meansChecks for loops with a range bound that is a mutable variable. It is in the suspicious group and warns by default.
What you see
warning: attempt to mutate range bound within loop --> main.rs:5:5 | 5 | x += 1; // x is a range bound that is mutated | ^ | = note: the range of the loop is unchanged = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#mut_range_bound = note: `#[warn(clippy::mut_range_bound)]` on by default
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
One might think that modifying the mutable variable changes the loop bounds. It doesn’t.
Code that is most likely wrong or useless. Warns by default.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
let mut x = 5;
for _ in 0..x {
x += 1; // x is a range bound that is mutated
..; // some other expression
break; // leaves the loop, so mutation is not an issue
}
Write this instead
let mut foo = 42;
for i in 0..foo {
foo -= 1;
println!("{i}"); // prints numbers from 0 to 41, not 0 to 21
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::mut_range_bound)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
mut_range_bound = "allow"One run
cargo clippy -- -A clippy::mut-range-boundThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for loops with a range bound that is a mutable variable.
Why is this bad?
One might think that modifying the mutable variable changes the loop bounds. It doesn’t.
Known problems
False positive when mutation is followed by a break, but the break is not immediately
after the mutation:
let mut x = 5;
for _ in 0..x {
x += 1; // x is a range bound that is mutated
..; // some other expression
break; // leaves the loop, so mutation is not an issue
}
False positive on nested loops (#6072)
Example
let mut foo = 42;
for i in 0..foo {
foo -= 1;
println!("{i}"); // prints numbers from 0 to 41, not 0 to 21
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- misrefactored_assign_opvariable appears on both sides of an assignment operation
- missing_transmute_annotationsChecks if transmute calls have all generics specified
- multi_assignmentsassignments don't nest intuitively
- mutable_key_typeChecks for sets/maps with mutable key types
- needless_character_iterationchecking if a string is ascii using iterators
- needless_maybe_sized`?Sized` bound is ignored because of a `Sized` requirement
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::misrefactored_assign_opvariable appears on both sides of an assignment operationRead it next →Did this answer your question?