From 698f8c2f01ea549d77d7dc3338a12e04c11057b9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:02:58 +0200 Subject: Adding upstream version 1.64.0+dfsg1. Signed-off-by: Daniel Baumann --- .../clippy/tests/ui/unnecessary_sort_by.fixed | 103 +++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/tools/clippy/tests/ui/unnecessary_sort_by.fixed (limited to 'src/tools/clippy/tests/ui/unnecessary_sort_by.fixed') diff --git a/src/tools/clippy/tests/ui/unnecessary_sort_by.fixed b/src/tools/clippy/tests/ui/unnecessary_sort_by.fixed new file mode 100644 index 000000000..21e2da474 --- /dev/null +++ b/src/tools/clippy/tests/ui/unnecessary_sort_by.fixed @@ -0,0 +1,103 @@ +// run-rustfix + +#![allow(clippy::stable_sort_primitive)] + +use std::cell::Ref; + +fn unnecessary_sort_by() { + fn id(x: isize) -> isize { + x + } + + let mut vec: Vec = vec![3, 6, 1, 2, 5]; + // Forward examples + vec.sort(); + vec.sort_unstable(); + vec.sort_by_key(|a| (a + 5).abs()); + vec.sort_unstable_by_key(|a| id(-a)); + // Reverse examples + vec.sort_by(|a, b| b.cmp(a)); // not linted to avoid suggesting `Reverse(b)` which would borrow + vec.sort_by_key(|b| std::cmp::Reverse((b + 5).abs())); + vec.sort_unstable_by_key(|b| std::cmp::Reverse(id(-b))); + // Negative examples (shouldn't be changed) + let c = &7; + vec.sort_by(|a, b| (b - a).cmp(&(a - b))); + vec.sort_by(|_, b| b.cmp(&5)); + vec.sort_by(|_, b| b.cmp(c)); + vec.sort_unstable_by(|a, _| a.cmp(c)); + + // Vectors of references are fine as long as the resulting key does not borrow + let mut vec: Vec<&&&isize> = vec![&&&3, &&&6, &&&1, &&&2, &&&5]; + vec.sort_by_key(|a| (***a).abs()); + vec.sort_unstable_by_key(|a| (***a).abs()); + // `Reverse(b)` would borrow in the following cases, don't lint + vec.sort_by(|a, b| b.cmp(a)); + vec.sort_unstable_by(|a, b| b.cmp(a)); + + // No warning if element does not implement `Ord` + let mut vec: Vec> = Vec::new(); + vec.sort_unstable_by(|a, b| a.cmp(b)); +} + +// Do not suggest returning a reference to the closure parameter of `Vec::sort_by_key` +mod issue_5754 { + #[derive(Clone, Copy)] + struct Test(usize); + + #[derive(PartialOrd, Ord, PartialEq, Eq)] + struct Wrapper<'a>(&'a usize); + + impl Test { + fn name(&self) -> &usize { + &self.0 + } + + fn wrapped(&self) -> Wrapper<'_> { + Wrapper(&self.0) + } + } + + pub fn test() { + let mut args: Vec = vec![]; + + // Forward + args.sort_by(|a, b| a.name().cmp(b.name())); + args.sort_by(|a, b| a.wrapped().cmp(&b.wrapped())); + args.sort_unstable_by(|a, b| a.name().cmp(b.name())); + args.sort_unstable_by(|a, b| a.wrapped().cmp(&b.wrapped())); + // Reverse + args.sort_by(|a, b| b.name().cmp(a.name())); + args.sort_by(|a, b| b.wrapped().cmp(&a.wrapped())); + args.sort_unstable_by(|a, b| b.name().cmp(a.name())); + args.sort_unstable_by(|a, b| b.wrapped().cmp(&a.wrapped())); + } +} + +// The closure parameter is not dereferenced anymore, so non-Copy types can be linted +mod issue_6001 { + struct Test(String); + + impl Test { + // Return an owned type so that we don't hit the fix for 5754 + fn name(&self) -> String { + self.0.clone() + } + } + + pub fn test() { + let mut args: Vec = vec![]; + + // Forward + args.sort_by_key(|a| a.name()); + args.sort_unstable_by_key(|a| a.name()); + // Reverse + args.sort_by_key(|b| std::cmp::Reverse(b.name())); + args.sort_unstable_by_key(|b| std::cmp::Reverse(b.name())); + } +} + +fn main() { + unnecessary_sort_by(); + issue_5754::test(); + issue_6001::test(); +} -- cgit v1.2.3