Rollup merge of #114322 - Urgau:fix-issue-110063, r=compiler-errors
Fix invalid slice coercion suggestion reported in turbofish This PR fixes the invalid slice coercion suggestion reported in turbofish and inferred generics by not emitting them. Fixes https://github.com/rust-lang/rust/issues/110063
This commit is contained in:
commit
1778c58905
4 changed files with 54 additions and 3 deletions
|
@ -3030,8 +3030,9 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
self.report_similar_impl_candidates_for_root_obligation(&obligation, *trait_predicate, body_def_id, err);
|
self.report_similar_impl_candidates_for_root_obligation(&obligation, *trait_predicate, body_def_id, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.maybe_suggest_convert_to_slice(
|
self.suggest_convert_to_slice(
|
||||||
err,
|
err,
|
||||||
|
obligation,
|
||||||
trait_ref,
|
trait_ref,
|
||||||
impl_candidates.as_slice(),
|
impl_candidates.as_slice(),
|
||||||
span,
|
span,
|
||||||
|
|
|
@ -398,9 +398,10 @@ pub trait TypeErrCtxtExt<'tcx> {
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
) -> Vec<Option<(Span, (DefId, Ty<'tcx>))>>;
|
) -> Vec<Option<(Span, (DefId, Ty<'tcx>))>>;
|
||||||
|
|
||||||
fn maybe_suggest_convert_to_slice(
|
fn suggest_convert_to_slice(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diagnostic,
|
err: &mut Diagnostic,
|
||||||
|
obligation: &PredicateObligation<'tcx>,
|
||||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||||
candidate_impls: &[ImplCandidate<'tcx>],
|
candidate_impls: &[ImplCandidate<'tcx>],
|
||||||
span: Span,
|
span: Span,
|
||||||
|
@ -3944,13 +3945,20 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
/// If the type that failed selection is an array or a reference to an array,
|
/// If the type that failed selection is an array or a reference to an array,
|
||||||
/// but the trait is implemented for slices, suggest that the user converts
|
/// but the trait is implemented for slices, suggest that the user converts
|
||||||
/// the array into a slice.
|
/// the array into a slice.
|
||||||
fn maybe_suggest_convert_to_slice(
|
fn suggest_convert_to_slice(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diagnostic,
|
err: &mut Diagnostic,
|
||||||
|
obligation: &PredicateObligation<'tcx>,
|
||||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||||
candidate_impls: &[ImplCandidate<'tcx>],
|
candidate_impls: &[ImplCandidate<'tcx>],
|
||||||
span: Span,
|
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:
|
// Three cases where we can make a suggestion:
|
||||||
// 1. `[T; _]` (array of T)
|
// 1. `[T; _]` (array of T)
|
||||||
// 2. `&[T; _]` (reference to array of T)
|
// 2. `&[T; _]` (reference to array of T)
|
||||||
|
|
13
tests/ui/dst/issue-90528-unsizing-not-suggestion-110063.rs
Normal file
13
tests/ui/dst/issue-90528-unsizing-not-suggestion-110063.rs
Normal 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
|
||||||
|
}
|
|
@ -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`.
|
Loading…
Add table
Reference in a new issue