Fix wrong span for trait selection failure error reporting
This commit is contained in:
parent
fcf3006e01
commit
3635b48973
4 changed files with 83 additions and 0 deletions
|
@ -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(
|
||||
|
|
25
tests/ui/dst/issue-113447.fixed
Normal file
25
tests/ui/dst/issue-113447.fixed
Normal 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]`
|
||||
}
|
25
tests/ui/dst/issue-113447.rs
Normal file
25
tests/ui/dst/issue-113447.rs
Normal 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]`
|
||||
}
|
25
tests/ui/dst/issue-113447.stderr
Normal file
25
tests/ui/dst/issue-113447.stderr
Normal 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`.
|
Loading…
Add table
Reference in a new issue