Rollup merge of #146403 - cyrgani:array-sugg-sorting, r=fee1-dead

sort array trait implementation suggestions correctly

Fixes rust-lang/rust#135098.
Previously tried in rust-lang/rust#137428.
This commit is contained in:
Jana Dönszelmann
2025-09-13 02:40:44 +02:00
committed by GitHub
3 changed files with 23 additions and 11 deletions

View File

@@ -27,8 +27,8 @@ use rustc_middle::ty::print::{
with_forced_trimmed_paths, with_forced_trimmed_paths,
}; };
use rustc_middle::ty::{ use rustc_middle::ty::{
self, TraitRef, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt, self, GenericArgKind, TraitRef, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable,
Upcast, TypeVisitableExt, Upcast,
}; };
use rustc_middle::{bug, span_bug}; use rustc_middle::{bug, span_bug};
use rustc_span::{BytePos, DUMMY_SP, STDLIB_STABLE_CRATES, Span, Symbol, sym}; use rustc_span::{BytePos, DUMMY_SP, STDLIB_STABLE_CRATES, Span, Symbol, sym};
@@ -2316,7 +2316,19 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
cand cand
}) })
.collect(); .collect();
impl_candidates.sort_by_key(|cand| (cand.similarity, cand.trait_ref.to_string())); impl_candidates.sort_by_key(|cand| {
// When suggesting array types, sort them by the length of the array, not lexicographically (#135098)
let len = if let GenericArgKind::Type(ty) = cand.trait_ref.args[0].kind()
&& let ty::Array(_, len) = ty.kind()
{
// Deprioritize suggestions for parameterized arrays.
len.try_to_target_usize(self.tcx).unwrap_or(u64::MAX)
} else {
0
};
(cand.similarity, len, cand.trait_ref.to_string())
});
let mut impl_candidates: Vec<_> = let mut impl_candidates: Vec<_> =
impl_candidates.into_iter().map(|cand| cand.trait_ref).collect(); impl_candidates.into_iter().map(|cand| cand.trait_ref).collect();
impl_candidates.dedup(); impl_candidates.dedup();

View File

@@ -8,11 +8,11 @@ LL | <[X; 35] as Default>::default();
&[T] &[T]
&mut [T] &mut [T]
[T; 0] [T; 0]
[T; 10] [T; 1]
[T; 11] [T; 2]
[T; 12] [T; 3]
[T; 13] [T; 4]
[T; 14] [T; 5]
and 27 others and 27 others
error: aborting due to 1 previous error error: aborting due to 1 previous error

View File

@@ -5,14 +5,14 @@ LL | let _: &[i8] = data.into();
| ^^^^ the trait `From<&[u8]>` is not implemented for `&[i8]` | ^^^^ the trait `From<&[u8]>` is not implemented for `&[i8]`
| |
= help: the following other types implement trait `From<T>`: = help: the following other types implement trait `From<T>`:
`[T; 10]` implements `From<(T, T, T, T, T, T, T, T, T, T)>`
`[T; 11]` implements `From<(T, T, T, T, T, T, T, T, T, T, T)>`
`[T; 12]` implements `From<(T, T, T, T, T, T, T, T, T, T, T, T)>`
`[T; 1]` implements `From<(T,)>` `[T; 1]` implements `From<(T,)>`
`[T; 2]` implements `From<(T, T)>` `[T; 2]` implements `From<(T, T)>`
`[T; 3]` implements `From<(T, T, T)>` `[T; 3]` implements `From<(T, T, T)>`
`[T; 4]` implements `From<(T, T, T, T)>` `[T; 4]` implements `From<(T, T, T, T)>`
`[T; 5]` implements `From<(T, T, T, T, T)>` `[T; 5]` implements `From<(T, T, T, T, T)>`
`[T; 6]` implements `From<(T, T, T, T, T, T)>`
`[T; 7]` implements `From<(T, T, T, T, T, T, T)>`
`[T; 8]` implements `From<(T, T, T, T, T, T, T, T)>`
and 6 others and 6 others
= note: required for `&[u8]` to implement `Into<&[i8]>` = note: required for `&[u8]` to implement `Into<&[i8]>`