Fix wrong span for trait selection failure error reporting

This commit is contained in:
yukang 2023-07-22 10:13:49 +08:00
parent fcf3006e01
commit 3635b48973
4 changed files with 83 additions and 0 deletions

View file

@ -2987,6 +2987,14 @@ fn try_to_add_help_message(
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

@ -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`.