Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::non_canonical_partial_ord_impl: Checks for non-canonical implementations of PartialOrd when Ord is already implemented
What it meansChecks for non-canonical implementations of PartialOrd when Ord is already implemented. It is in the suspicious group and warns by default.
Does it matter?
If both PartialOrd and Ord are implemented, they must agree. This is commonly done by wrapping the result of cmp in Some for partial_cmp. Not doing this may silently introduce an error upon refactoring.
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
#[derive(Eq, PartialEq)]
struct A(u32);
impl Ord for A {
fn cmp(&self, other: &Self) -> Ordering {
// ...
}
}
impl PartialOrd for A {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
// ...
}
}
Write this instead
#[derive(Eq, PartialEq)]
struct A(u32);
impl Ord for A {
fn cmp(&self, other: &Self) -> Ordering {
// ...
}
}
impl PartialOrd for A {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other)) // or self.cmp(other).into()
}
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::non_canonical_partial_ord_impl)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
non_canonical_partial_ord_impl = "allow"One run
cargo clippy -- -A clippy::non-canonical-partial-ord-implThe [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 non-canonical implementations of PartialOrd when Ord is already implemented.
Why is this bad?
If both PartialOrd and Ord are implemented, they must agree. This is commonly done by
wrapping the result of cmp in Some for partial_cmp. Not doing this may silently
introduce an error upon refactoring.
Known issues
Code that calls the .into() method instead will be flagged, despite .into() wrapping it
in Some.
Example
#[derive(Eq, PartialEq)]
struct A(u32);
impl Ord for A {
fn cmp(&self, other: &Self) -> Ordering {
// ...
}
}
impl PartialOrd for A {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
// ...
}
}
Use instead:
#[derive(Eq, PartialEq)]
struct A(u32);
impl Ord for A {
fn cmp(&self, other: &Self) -> Ordering {
// ...
}
}
impl PartialOrd for A {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other)) // or self.cmp(other).into()
}
}
Past names
- incorrect_partial_ord_impl_on_ord_type
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- needless_maybe_sized`?Sized` bound is ignored because of a `Sized` requirement
- no_effect_replacereplacing text with itself
- non_canonical_clone_implnon-canonical implementation of `clone` on a `Copy` type
- octal_escapesoctal-looking escape in a literal
- path_ends_with_extLooks for calls to Path::ends_with calls where the argument looks like a file extension. By default, Clippy has a short list of known filenames that start with a dot but aren’t necessarily file extensions (e.g
- permissions_set_readonly_falsecall to `set_readonly` with argument `false`
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::needless_maybe_sized`?Sized` bound is ignored because of a `Sized` requirementRead it next →Did this answer your question?