Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::mismatched_bit_width_type: possible buggy implementation of `bit_width`
What it meansChecks for usage of T::BITS - x.leading_zeros() where T and x are of different types. It is in the suspicious group and warns by default.
What you see
warning: possible buggy implementation of `bit_width` --> main.rs:4:17 | 4 | let bit_width = u32::BITS - x.leading_zeros(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: in order to calculate the bit width, `T::BITS` should match the type of the value calling `.leading_zeros()` = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#mismatched_bit_width_type = note: `#[warn(clippy::mismatched_bit_width_type)]` on by default help: if you meant to use `u64::BITS`, use | 4 - let bit_width = u32::BITS - x.leading_zeros(); 4 + let bit_width = x.bit_width(); |
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?
Substracting leading_zeros from the number of bits of another type might be a buggy implementation of the bit_width method.
Code that is most likely wrong or useless. Warns by default.
How to fix it
Clippy does not fix this one automatically (its suggestion may change behaviour, so it only shows it). Change the code by hand:
Flagged
let x: u64 = 5;
let bit_width = u32::BITS - x.leading_zeros();
Write this instead
let x: u64 = 5;
let bit_width = x.bit_width();
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::mismatched_bit_width_type)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
mismatched_bit_width_type = "allow"One run
cargo clippy -- -A clippy::mismatched-bit-width-typeThe [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 usage of T::BITS - x.leading_zeros() where T and x are of different types.
Why is this bad?
Substracting leading_zeros from the number of bits of another type might be
a buggy implementation of the bit_width method.
Example
let x: u64 = 5;
let bit_width = u32::BITS - x.leading_zeros();
Use instead:
let x: u64 = 5;
let bit_width = x.bit_width();
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- lines_filter_map_okChecks for usage of lines.filter_map(Result::ok) or lines.flat_map(Result::ok) when lines has type std::io::Lines
- macro_metavars_in_unsafeLooks for macros that expand metavariables in an unsafe block
- manual_unwrap_or_defaultmatch can be simplified with `.unwrap_or_default()`
- misnamed_gettersgetter function appears to return the wrong field
- misrefactored_assign_opvariable appears on both sides of an assignment operation
- missing_transmute_annotationsChecks if transmute calls have all generics specified
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::lines_filter_map_okChecks for usage of lines.filter_map(Result::ok) or lines.flat_map(Result::ok) when lines has type std::io::LinesRead it next →Did this answer your question?