Skip to content

Commit 910979a

Browse files
committed
fix misleading cannot infer type for type parameter error
1 parent ebb80ec commit 910979a

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs

+22
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
866866
}
867867
}
868868

869+
self.report_ambiguous_type_parameter(&mut err, arg);
869870
err.span_label(
870871
span,
871872
arg_data.cannot_infer_msg(use_diag.filter(|d| d.applies_to(span))),
@@ -933,6 +934,27 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
933934
}
934935
}
935936

937+
fn report_ambiguous_type_parameter(&self, err: &mut Diagnostic, arg: GenericArg<'tcx>) {
938+
if let GenericArgKind::Type(ty) = arg.unpack()
939+
&& let ty::Infer(ty::TyVar(ty_vid)) = *ty.kind()
940+
{
941+
let mut inner = self.inner.borrow_mut();
942+
let ty_vars = &inner.type_variables();
943+
let var_origin = ty_vars.var_origin(ty_vid);
944+
if let TypeVariableOriginKind::TypeParameterDefinition(name, Some(def_id)) =
945+
var_origin.kind
946+
&& let Some(parent_def_id) = self.tcx.parent(def_id).as_local()
947+
&& let Some(hir::Node::Item(item)) = self.tcx.hir().find_by_def_id(parent_def_id)
948+
&& let hir::ItemKind::Impl(impl_item) = item.kind
949+
&& let Some(trait_ref) = &impl_item.of_trait
950+
&& let Some(did) = trait_ref.trait_def_id()
951+
&& self.tcx.generics_of(did).params.iter().any(|param| param.name == name)
952+
{
953+
err.span_help(self.tcx.def_span(def_id), "type parameter declared here");
954+
}
955+
}
956+
}
957+
936958
pub fn need_type_info_err_in_generator(
937959
&self,
938960
kind: hir::GeneratorKind,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use std::collections::HashMap;
2+
3+
trait Store<K, V> {
4+
fn get_raw(&self, key: &K) -> Option<()>;
5+
}
6+
7+
struct InMemoryStore;
8+
9+
impl<K> Store<String, HashMap<K, String>> for InMemoryStore {
10+
fn get_raw(&self, key: &String) -> Option<()> {
11+
None
12+
}
13+
}
14+
15+
fn main() {
16+
InMemoryStore.get_raw(&String::default()); //~ ERROR type annotations needed
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error[E0282]: type annotations needed
2+
--> $DIR/ambiguous_type_parameter.rs:16:19
3+
|
4+
LL | InMemoryStore.get_raw(&String::default());
5+
| ^^^^^^^ cannot infer type for type parameter `K`
6+
|
7+
help: type parameter declared here
8+
--> $DIR/ambiguous_type_parameter.rs:9:6
9+
|
10+
LL | impl<K> Store<String, HashMap<K, String>> for InMemoryStore {
11+
| ^
12+
13+
error: aborting due to previous error
14+
15+
For more information about this error, try `rustc --explain E0282`.

src/test/ui/traits/not-suggest-non-existing-fully-qualified-path.stderr

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ LL | a.method();
1616
| | cannot infer type for type parameter `U`
1717
| this method call resolves to `U`
1818
|
19+
help: type parameter declared here
20+
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:12:9
21+
|
22+
LL | impl<T, U> V<U> for A<T>
23+
| ^
1924
note: multiple `impl`s satisfying `B: I<_>` found
2025
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:5:1
2126
|

0 commit comments

Comments
 (0)