mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-24 07:44:10 +00:00
Auto merge of #96940 - TaKO8Ki:stop-suggesting-wrong-fully-qualified-path, r=estebank
Stop suggesting non-existing fully qualified paths This patch fixes a part of #96295. r? `@estebank`
This commit is contained in:
commit
4f8e2e3ad9
@ -739,7 +739,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
{
|
||||
let mut eraser = TypeParamEraser(self.tcx);
|
||||
let candidate_len = impl_candidates.len();
|
||||
let mut suggestions: Vec<_> = impl_candidates.iter().map(|candidate| {
|
||||
let mut suggestions: Vec<_> = impl_candidates.iter().filter_map(|candidate| {
|
||||
let trait_item = self.tcx
|
||||
.associated_items(candidate.def_id)
|
||||
.find_by_name_and_kind(
|
||||
@ -748,6 +748,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
ty::AssocKind::Fn,
|
||||
candidate.def_id
|
||||
);
|
||||
if trait_item.is_none() {
|
||||
return None;
|
||||
}
|
||||
let prefix = if let Some(trait_item) = trait_item
|
||||
&& let Some(trait_m) = trait_item.def_id.as_local()
|
||||
&& let hir::TraitItemKind::Fn(fn_, _) = &self.tcx.hir().trait_item(hir::TraitItemId { def_id: trait_m }).kind
|
||||
@ -761,24 +764,26 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
""
|
||||
};
|
||||
let candidate = candidate.super_fold_with(&mut eraser);
|
||||
vec![
|
||||
Some(vec![
|
||||
(expr.span.shrink_to_lo(), format!("{}::{}({}", candidate, segment.ident, prefix)),
|
||||
if exprs.len() == 1 {
|
||||
(expr.span.shrink_to_hi().with_hi(e.span.hi()), ")".to_string())
|
||||
} else {
|
||||
(expr.span.shrink_to_hi().with_hi(exprs[1].span.lo()), ", ".to_string())
|
||||
},
|
||||
]
|
||||
])
|
||||
}).collect();
|
||||
suggestions.sort_by(|a, b| a[0].1.cmp(&b[0].1));
|
||||
err.multipart_suggestions(
|
||||
&format!(
|
||||
"use the fully qualified path for the potential candidate{}",
|
||||
pluralize!(candidate_len),
|
||||
),
|
||||
suggestions.into_iter(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
if !suggestions.is_empty() {
|
||||
err.multipart_suggestions(
|
||||
&format!(
|
||||
"use the fully qualified path for the potential candidate{}",
|
||||
pluralize!(candidate_len),
|
||||
),
|
||||
suggestions.into_iter(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
}
|
||||
// Suggest specifying type params or point out the return type of the call:
|
||||
//
|
||||
|
@ -0,0 +1,24 @@
|
||||
struct A<T>(T);
|
||||
struct B;
|
||||
|
||||
trait I<T> {}
|
||||
impl I<i32> for B {}
|
||||
impl I<u32> for B {}
|
||||
|
||||
trait V<U> {
|
||||
fn method(self) -> U;
|
||||
}
|
||||
|
||||
impl<T, U> V<U> for A<T>
|
||||
where
|
||||
T: I<U>,
|
||||
{
|
||||
fn method(self) -> U { unimplemented!() }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a = A(B);
|
||||
a.method();
|
||||
//~^ ERROR type annotations needed
|
||||
//~| ERROR type annotations needed
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:21:7
|
||||
|
|
||||
LL | a.method();
|
||||
| --^^^^^^--
|
||||
| | |
|
||||
| | cannot infer type for type parameter `U` declared on the trait `V`
|
||||
| this method call resolves to `U`
|
||||
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:21:7
|
||||
|
|
||||
LL | a.method();
|
||||
| --^^^^^^--
|
||||
| | |
|
||||
| | cannot infer type for type parameter `U`
|
||||
| this method call resolves to `U`
|
||||
|
|
||||
note: multiple `impl`s satisfying `B: I<_>` found
|
||||
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:5:1
|
||||
|
|
||||
LL | impl I<i32> for B {}
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
LL | impl I<u32> for B {}
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
note: required because of the requirements on the impl of `V<_>` for `A<B>`
|
||||
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:12:12
|
||||
|
|
||||
LL | impl<T, U> V<U> for A<T>
|
||||
| ^^^^ ^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0282, E0283.
|
||||
For more information about an error, try `rustc --explain E0282`.
|
Loading…
Reference in New Issue
Block a user