Fix invalid slice coercion suggestion reported in turbofish

This commit is contained in:
Urgau 2023-08-01 11:50:06 +02:00
parent 04411507be
commit 87e8feaf50
4 changed files with 51 additions and 0 deletions

View file

@ -3034,6 +3034,7 @@ fn try_to_add_help_message(
self.maybe_suggest_convert_to_slice(
err,
obligation,
trait_ref,
impl_candidates.as_slice(),
span,

View file

@ -401,6 +401,7 @@ fn probe_assoc_types_at_expr(
fn maybe_suggest_convert_to_slice(
&self,
err: &mut Diagnostic,
obligation: &PredicateObligation<'tcx>,
trait_ref: ty::PolyTraitRef<'tcx>,
candidate_impls: &[ImplCandidate<'tcx>],
span: Span,
@ -3957,10 +3958,17 @@ fn probe_assoc_types_at_expr(
fn maybe_suggest_convert_to_slice(
&self,
err: &mut Diagnostic,
obligation: &PredicateObligation<'tcx>,
trait_ref: ty::PolyTraitRef<'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 {
return;
};
// Three cases where we can make a suggestion:
// 1. `[T; _]` (array of T)
// 2. `&[T; _]` (reference to array of T)

View file

@ -0,0 +1,13 @@
trait Test {}
impl Test for &[u8] {}
fn needs_test<T: Test>() -> T {
panic!()
}
fn main() {
needs_test::<[u8; 1]>();
//~^ ERROR the trait bound
let x: [u8; 1] = needs_test();
//~^ ERROR the trait bound
}

View file

@ -0,0 +1,29 @@
error[E0277]: the trait bound `[u8; 1]: Test` is not satisfied
--> $DIR/issue-90528-unsizing-not-suggestion-110063.rs:9:18
|
LL | needs_test::<[u8; 1]>();
| ^^^^^^^ the trait `Test` is not implemented for `[u8; 1]`
|
= help: the trait `Test` is implemented for `&[u8]`
note: required by a bound in `needs_test`
--> $DIR/issue-90528-unsizing-not-suggestion-110063.rs:4:18
|
LL | fn needs_test<T: Test>() -> T {
| ^^^^ required by this bound in `needs_test`
error[E0277]: the trait bound `[u8; 1]: Test` is not satisfied
--> $DIR/issue-90528-unsizing-not-suggestion-110063.rs:11:22
|
LL | let x: [u8; 1] = needs_test();
| ^^^^^^^^^^ the trait `Test` is not implemented for `[u8; 1]`
|
= help: the trait `Test` is implemented for `&[u8]`
note: required by a bound in `needs_test`
--> $DIR/issue-90528-unsizing-not-suggestion-110063.rs:4:18
|
LL | fn needs_test<T: Test>() -> T {
| ^^^^ required by this bound in `needs_test`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0277`.