Clippy lints / Style
Clippy lint · Style · checked with Clippy 0.1.99
clippy::manual_is_ascii_check: manual check for common ascii range
What it meansSuggests to use dedicated built-in methods, is_ascii_(lowercase|uppercase|digit|hexdigit) for checking on corresponding ascii range It is in the style group and warns by default.
What you see
warning: manual check for common ascii range --> main.rs:2:13 | 2 | assert!(matches!('x', 'a'..='z')); | ^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#manual_is_ascii_check = note: `#[warn(clippy::manual_is_ascii_check)]` on by default help: try | 2 - assert!(matches!('x', 'a'..='z')); 2 + assert!('x'.is_ascii_lowercase()); |
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?
Using the built-in functions is more readable and makes it clear that it’s not a specific subset of characters, but all ASCII (lowercase|uppercase|digit|hexdigit) characters.
Code that works but is not idiomatic Rust. Warns by default.
How to fix it
Clippy can fix this one for you: run cargo clippy --fix (add --allow-dirty if you have uncommitted changes). Review the diff before you commit.
Flagged
fn main() {
assert!(matches!('x', 'a'..='z'));
assert!(matches!(b'X', b'A'..=b'Z'));
assert!(matches!('2', '0'..='9'));
assert!(matches!('x', 'A'..='Z' | 'a'..='z'));
assert!(matches!('C', '0'..='9' | 'a'..='f' | 'A'..='F'));
('0'..='9').contains(&'0');
('a'..='z').contains(&'a');
('A'..='Z').contains(&'A');
}
Write this instead
fn main() {
assert!('x'.is_ascii_lowercase());
assert!(b'X'.is_ascii_uppercase());
assert!('2'.is_ascii_digit());
assert!('x'.is_ascii_alphabetic());
assert!('C'.is_ascii_hexdigit());
'0'.is_ascii_digit();
'a'.is_ascii_lowercase();
'A'.is_ascii_uppercase();
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::manual_is_ascii_check)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
manual_is_ascii_check = "allow"One run
cargo clippy -- -A clippy::manual-is-ascii-checkThe [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.
Settings in clippy.toml
msrv: The minimum rust version that the project supports. Defaults to the rust-version field in Cargo.toml
Clippy's own documentation
What it does
Suggests to use dedicated built-in methods,
is_ascii_(lowercase|uppercase|digit|hexdigit) for checking on corresponding
ascii range
Why is this bad?
Using the built-in functions is more readable and makes it clear that it’s not a specific subset of characters, but all ASCII (lowercase|uppercase|digit|hexdigit) characters.
Example
fn main() {
assert!(matches!('x', 'a'..='z'));
assert!(matches!(b'X', b'A'..=b'Z'));
assert!(matches!('2', '0'..='9'));
assert!(matches!('x', 'A'..='Z' | 'a'..='z'));
assert!(matches!('C', '0'..='9' | 'a'..='f' | 'A'..='F'));
('0'..='9').contains(&'0');
('a'..='z').contains(&'a');
('A'..='Z').contains(&'A');
}
Use instead:
fn main() {
assert!('x'.is_ascii_lowercase());
assert!(b'X'.is_ascii_uppercase());
assert!('2'.is_ascii_digit());
assert!('x'.is_ascii_alphabetic());
assert!('C'.is_ascii_hexdigit());
'0'.is_ascii_digit();
'a'.is_ascii_lowercase();
'A'.is_ascii_uppercase();
}
Configuration
-
msrv: The minimum rust version that the project supports. Defaults to therust-versionfield inCargo.toml(default:
current version)
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- needless_returnunneeded `return` statement
- new_without_defaultChecks for public types with a pub fn new() -> Self method and no implementation of Default
- len_zeroChecks for getting the length of something via .len() just to compare to zero, and suggests using .is_empty() where applicable
- manual_async_fnthis function can be simplified using the `async fn` syntax
- manual_bitsusage of `size_of::<T>()` to obtain the size of `T` in bits
- manual_dangling_ptrmanual creation of a dangling pointer
- manual_is_finiteChecks for manual is_finite reimplementations (i.e., x != <float>::INFINITY && x != <float>::NEG_INFINITY)
- manual_is_infiniteChecks for manual is_infinite reimplementations (i.e., x == <float>::INFINITY || x == <float>::NEG_INFINITY)
- manual_mapmanual implementation of `Option::map`
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::needless_returnunneeded `return` statementRead it next →Did this answer your question?