Allow Self::cmp(self, other) as a correct impl

This commit is contained in:
Catherine 2023-07-19 02:59:06 -05:00 committed by Catherine Flores
parent d4a6634d37
commit a4c367d0e9
7 changed files with 211 additions and 14 deletions

View file

@ -1,5 +1,4 @@
//@run-rustfix
#![allow(unused)]
#![no_main]
use std::cmp::Ordering;
@ -112,3 +111,35 @@ impl PartialOrd<u32> for F {
todo!();
}
}
// #11178, do not lint
#[derive(Eq, PartialEq)]
struct G(u32);
impl Ord for G {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl PartialOrd for G {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(Self::cmp(self, other))
}
}
#[derive(Eq, PartialEq)]
struct H(u32);
impl Ord for H {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl PartialOrd for H {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(Ord::cmp(self, other))
}
}

View file

@ -1,5 +1,4 @@
//@run-rustfix
#![allow(unused)]
#![no_main]
use std::cmp::Ordering;
@ -116,3 +115,35 @@ impl PartialOrd<u32> for F {
todo!();
}
}
// #11178, do not lint
#[derive(Eq, PartialEq)]
struct G(u32);
impl Ord for G {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl PartialOrd for G {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(Self::cmp(self, other))
}
}
#[derive(Eq, PartialEq)]
struct H(u32);
impl Ord for H {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl PartialOrd for H {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(Ord::cmp(self, other))
}
}

View file

@ -1,5 +1,5 @@
error: incorrect implementation of `partial_cmp` on an `Ord` type
--> $DIR/incorrect_partial_ord_impl_on_ord_type.rs:18:1
--> $DIR/incorrect_partial_ord_impl_on_ord_type.rs:17:1
|
LL | / impl PartialOrd for A {
LL | | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
@ -13,7 +13,7 @@ LL | | }
= note: `#[deny(clippy::incorrect_partial_ord_impl_on_ord_type)]` on by default
error: incorrect implementation of `partial_cmp` on an `Ord` type
--> $DIR/incorrect_partial_ord_impl_on_ord_type.rs:52:1
--> $DIR/incorrect_partial_ord_impl_on_ord_type.rs:51:1
|
LL | / impl PartialOrd for C {
LL | | fn partial_cmp(&self, _: &Self) -> Option<Ordering> {

View file

@ -0,0 +1,51 @@
// This test's filename is... a bit verbose. But it ensures we suggest the correct code when `Ord`
// is not in scope.
#![no_main]
#![no_implicit_prelude]
extern crate std;
use std::cmp::{self, Eq, Ordering, PartialEq, PartialOrd};
use std::option::Option::{self, Some};
use std::todo;
// lint
#[derive(Eq, PartialEq)]
struct A(u32);
impl cmp::Ord for A {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl PartialOrd for A {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
// NOTE: This suggestion is wrong, as `Ord` is not in scope. But this should be fine as it isn't
// automatically applied
todo!();
}
}
#[derive(Eq, PartialEq)]
struct B(u32);
impl B {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl cmp::Ord for B {
fn cmp(&self, other: &Self) -> Ordering {
todo!();
}
}
impl PartialOrd for B {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
// This calls `B.cmp`, not `Ord::cmp`!
Some(self.cmp(other))
}
}

View file

@ -0,0 +1,31 @@
error: incorrect implementation of `partial_cmp` on an `Ord` type
--> $DIR/incorrect_partial_ord_impl_on_ord_type_fully_qual.rs:23:1
|
LL | / impl PartialOrd for A {
LL | | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
| | _____________________________________________________________-
LL | || // NOTE: This suggestion is wrong, as `Ord` is not in scope. But this should be fine as it isn't
LL | || // automatically applied
LL | || todo!();
LL | || }
| ||_____- help: change this to: `{ Some(self.cmp(other)) }`
LL | | }
| |__^
|
= note: `#[deny(clippy::incorrect_partial_ord_impl_on_ord_type)]` on by default
error: incorrect implementation of `partial_cmp` on an `Ord` type
--> $DIR/incorrect_partial_ord_impl_on_ord_type_fully_qual.rs:46:1
|
LL | / impl PartialOrd for B {
LL | | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
| | _____________________________________________________________-
LL | || // This calls `B.cmp`, not `Ord::cmp`!
LL | || Some(self.cmp(other))
LL | || }
| ||_____- help: change this to: `{ Some(std::cmp::Ord::cmp(self, other)) }`
LL | | }
| |__^
error: aborting due to 2 previous errors