Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::zero_repeat_side_effects: expression with side effects as the initial value in a zero-sized array initializer
What it meansChecks for array or vec initializations which contain an expression with side effects, but which have a repeat count of zero. It is in the suspicious group and warns by default.
What you see
warning: expression with side effects as the initial value in a zero-sized array initializer --> main.rs:7:1 | 7 | let a = [side_effect(); 0]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#zero_repeat_side_effects = note: `#[warn(clippy::zero_repeat_side_effects)]` on by default help: consider performing the side effect separately | 7 + side_effect(); 8 + let a: [i32; 0] = []; |
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?
Such an initialization, despite having a repeat length of 0, will still call the inner function. This may not be obvious and as such there may be unintended side effects in code.
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
fn side_effect() -> i32 {
println!("side effect");
10
}
let a = [side_effect(); 0];
Write this instead
fn side_effect() -> i32 {
println!("side effect");
10
}
side_effect();
let a: [i32; 0] = [];
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::zero_repeat_side_effects)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
zero_repeat_side_effects = "allow"One run
cargo clippy -- -A clippy::zero-repeat-side-effectsThe [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 array or vec initializations which contain an expression with side effects, but which have a repeat count of zero.
Why is this bad?
Such an initialization, despite having a repeat length of 0, will still call the inner function. This may not be obvious and as such there may be unintended side effects in code.
Example
fn side_effect() -> i32 {
println!("side effect");
10
}
let a = [side_effect(); 0];
Use instead:
fn side_effect() -> i32 {
println!("side effect");
10
}
side_effect();
let a: [i32; 0] = [];
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- unnecessary_clippy_cfgno need to put clippy lints behind a `clippy` cfg
- unnecessary_option_map_or_elseunused "map closure" when calling `Option::map_or_else` value
- unnecessary_result_map_or_elseChecks for usage of .map_or_else() “map closure” for Result type
- zombie_processesspawned process is never `wait()`ed on
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::unnecessary_clippy_cfgno need to put clippy lints behind a `clippy` cfgRead it next →Did this answer your question?