Rollup merge of #113945 - chenyukang:yukang-fix-113447-slice-2, r=cjgillot

Fix wrong span for trait selection failure error reporting

Fixes #113447
This commit is contained in:
Matthias Krüger 2023-08-04 21:31:55 +02:00 committed by GitHub
commit 5054e41b64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 88 additions and 3 deletions

View File

@ -2987,6 +2987,14 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
unsatisfied_const: bool,
) {
let body_def_id = obligation.cause.body_id;
let span = if let ObligationCauseCode::BinOp { rhs_span: Some(rhs_span), .. } =
obligation.cause.code()
{
*rhs_span
} else {
span
};
// Try to report a help message
if is_fn_trait
&& let Ok((implemented_kind, params)) = self.type_implements_fn_trait(

View File

@ -3953,9 +3953,11 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
candidate_impls: &[ImplCandidate<'tcx>],
span: Span,
) {
// We can only suggest the slice coersion for function arguments since the suggestion
// would make no sense in turbofish or call
let ObligationCauseCode::FunctionArgumentObligation { .. } = obligation.cause.code() else {
// We can only suggest the slice coersion for function and binary operation arguments,
// since the suggestion would make no sense in turbofish or call
let (ObligationCauseCode::BinOp { .. }
| ObligationCauseCode::FunctionArgumentObligation { .. }) = obligation.cause.code()
else {
return;
};

View File

@ -0,0 +1,25 @@
// run-rustfix
pub struct Bytes;
impl Bytes {
pub fn as_slice(&self) -> &[u8] {
todo!()
}
}
impl PartialEq<[u8]> for Bytes {
fn eq(&self, other: &[u8]) -> bool {
self.as_slice() == other
}
}
impl PartialEq<Bytes> for &[u8] {
fn eq(&self, other: &Bytes) -> bool {
*other == **self
}
}
fn main() {
let _ = &[0u8] == &[0xAA][..]; //~ ERROR can't compare `&[u8; 1]` with `[{integer}; 1]`
}

View File

@ -0,0 +1,25 @@
// run-rustfix
pub struct Bytes;
impl Bytes {
pub fn as_slice(&self) -> &[u8] {
todo!()
}
}
impl PartialEq<[u8]> for Bytes {
fn eq(&self, other: &[u8]) -> bool {
self.as_slice() == other
}
}
impl PartialEq<Bytes> for &[u8] {
fn eq(&self, other: &Bytes) -> bool {
*other == **self
}
}
fn main() {
let _ = &[0u8] == [0xAA]; //~ ERROR can't compare `&[u8; 1]` with `[{integer}; 1]`
}

View File

@ -0,0 +1,25 @@
error[E0277]: can't compare `&[u8; 1]` with `[{integer}; 1]`
--> $DIR/issue-113447.rs:24:20
|
LL | let _ = &[0u8] == [0xAA];
| ^^ no implementation for `&[u8; 1] == [{integer}; 1]`
|
= help: the trait `PartialEq<[{integer}; 1]>` is not implemented for `&[u8; 1]`
= help: the following other types implement trait `PartialEq<Rhs>`:
<[A; N] as PartialEq<[B; N]>>
<[A; N] as PartialEq<[B]>>
<[A; N] as PartialEq<&[B]>>
<[A; N] as PartialEq<&mut [B]>>
<[T] as PartialEq<Vec<U, A>>>
<[A] as PartialEq<[B]>>
<[B] as PartialEq<[A; N]>>
<&[u8] as PartialEq<Bytes>>
and 4 others
help: convert the array to a `&[u8]` slice instead
|
LL | let _ = &[0u8] == &[0xAA][..];
| + ++++
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.