Skip to content

Commit 063c5c1

Browse files
authored
correct suggestion for unnecessary_sort_by in no_std (#13836)
fix #11524 In a `no_std` environment, we can use `core::cmp::Reverse` instead of `std::cmp::Reverse`. ---- changelog: [`unnecessary_sort_by`]: correct suggestion in `no_std`
2 parents 968669b + 1a23b5b commit 063c5c1

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

clippy_lints/src/methods/unnecessary_sort_by.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
2-
use clippy_utils::is_trait_method;
32
use clippy_utils::sugg::Sugg;
43
use clippy_utils::ty::implements_trait;
4+
use clippy_utils::{is_trait_method, std_or_core};
55
use rustc_errors::Applicability;
66
use rustc_hir::{Closure, Expr, ExprKind, Mutability, Param, Pat, PatKind, Path, PathSegment, QPath};
77
use rustc_lint::LateContext;
@@ -212,8 +212,10 @@ pub(super) fn check<'tcx>(
212212
trigger.vec_name,
213213
if is_unstable { "_unstable" } else { "" },
214214
trigger.closure_arg,
215-
if trigger.reverse {
216-
format!("std::cmp::Reverse({})", trigger.closure_body)
215+
if let Some(std_or_core) = std_or_core(cx)
216+
&& trigger.reverse
217+
{
218+
format!("{}::cmp::Reverse({})", std_or_core, trigger.closure_body)
217219
} else {
218220
trigger.closure_body.to_string()
219221
},
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#![no_std]
2+
extern crate alloc;
3+
use alloc::vec;
4+
use alloc::vec::Vec;
5+
6+
fn issue_11524() -> Vec<i32> {
7+
let mut vec = vec![1, 2, 3];
8+
9+
// Should lint and suggest `vec.sort_by_key(|a| a + 1);`
10+
vec.sort_by_key(|a| a + 1);
11+
vec
12+
}
13+
14+
fn issue_11524_2() -> Vec<i32> {
15+
let mut vec = vec![1, 2, 3];
16+
17+
// Should lint and suggest `vec.sort_by_key(|b| core::cmp::Reverse(b + 1));`
18+
vec.sort_by_key(|b| core::cmp::Reverse(b + 1));
19+
vec
20+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#![no_std]
2+
extern crate alloc;
3+
use alloc::vec;
4+
use alloc::vec::Vec;
5+
6+
fn issue_11524() -> Vec<i32> {
7+
let mut vec = vec![1, 2, 3];
8+
9+
// Should lint and suggest `vec.sort_by_key(|a| a + 1);`
10+
vec.sort_by(|a, b| (a + 1).cmp(&(b + 1)));
11+
vec
12+
}
13+
14+
fn issue_11524_2() -> Vec<i32> {
15+
let mut vec = vec![1, 2, 3];
16+
17+
// Should lint and suggest `vec.sort_by_key(|b| core::cmp::Reverse(b + 1));`
18+
vec.sort_by(|a, b| (b + 1).cmp(&(a + 1)));
19+
vec
20+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
error: consider using `sort_by_key`
2+
--> tests/ui/unnecessary_sort_by_no_std.rs:10:5
3+
|
4+
LL | vec.sort_by(|a, b| (a + 1).cmp(&(b + 1)));
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_by_key(|a| a + 1)`
6+
|
7+
= note: `-D clippy::unnecessary-sort-by` implied by `-D warnings`
8+
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_sort_by)]`
9+
10+
error: consider using `sort_by_key`
11+
--> tests/ui/unnecessary_sort_by_no_std.rs:18:5
12+
|
13+
LL | vec.sort_by(|a, b| (b + 1).cmp(&(a + 1)));
14+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.sort_by_key(|b| core::cmp::Reverse(b + 1))`
15+
16+
error: aborting due to 2 previous errors
17+

0 commit comments

Comments
 (0)