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,
|
unsatisfied_const: bool,
|
||||||
) {
|
) {
|
||||||
let body_def_id = obligation.cause.body_id;
|
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
|
// Try to report a help message
|
||||||
if is_fn_trait
|
if is_fn_trait
|
||||||
&& let Ok((implemented_kind, params)) = self.type_implements_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