mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-11 06:24:24 +00:00
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:
commit
5054e41b64
@ -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(
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
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…
Reference in New Issue
Block a user