diff --git a/src/librustc/infer/error_reporting/need_type_info.rs b/src/librustc/infer/error_reporting/need_type_info.rs index 173f916c2824..aae7b5e1202d 100644 --- a/src/librustc/infer/error_reporting/need_type_info.rs +++ b/src/librustc/infer/error_reporting/need_type_info.rs @@ -15,7 +15,7 @@ struct FindLocalByTypeVisitor<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> { hir_map: &'a hir::map::Map<'gcx>, found_local_pattern: Option<&'gcx Pat>, found_arg_pattern: Option<&'gcx Pat>, - found_ty: Option>, + found_ty: Option, } impl<'a, 'gcx, 'tcx> FindLocalByTypeVisitor<'a, 'gcx, 'tcx> { @@ -55,7 +55,7 @@ impl<'a, 'gcx, 'tcx> Visitor<'gcx> for FindLocalByTypeVisitor<'a, 'gcx, 'tcx> { fn visit_local(&mut self, local: &'gcx Local) { if let (None, Some(ty)) = (self.found_local_pattern, self.node_matches_type(local.hir_id)) { self.found_local_pattern = Some(&*local.pat); - self.found_ty = Some(ty); + self.found_ty = Some(ty.to_string()); } intravisit::walk_local(self, local); } @@ -67,7 +67,7 @@ impl<'a, 'gcx, 'tcx> Visitor<'gcx> for FindLocalByTypeVisitor<'a, 'gcx, 'tcx> { self.node_matches_type(argument.hir_id), ) { self.found_arg_pattern = Some(&*argument.pat); - self.found_ty = Some(ty); + self.found_ty = Some(ty.to_string()); } } intravisit::walk_body(self, body); @@ -108,7 +108,6 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { let name = self.extract_type_name(&ty, None); let mut err_span = span; - let mut labels = vec![(span, InferCtxt::missing_type_msg(&name))]; let mut local_visitor = FindLocalByTypeVisitor { infcx: &self, @@ -124,10 +123,12 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { local_visitor.visit_expr(expr); } - let ty_msg = match local_visitor.found_ty { - Some(ty) if &ty.to_string() != "_" => format!(" for `{}`", ty), + let ty_msg = match &local_visitor.found_ty { + Some(ty) if &ty[..] != "_" && ty != &name => format!(" in `{}`", ty), _ => String::new(), }; + let mut labels = vec![(span, InferCtxt::missing_type_msg(&name, &ty_msg))]; + if let Some(pattern) = local_visitor.found_arg_pattern { err_span = pattern.span; // We don't want to show the default label for closures. @@ -148,8 +149,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { labels.clear(); labels.push((pattern.span, format!( "consider giving this closure parameter {}", - match local_visitor.found_ty { - Some(ty) if &ty.to_string() != "_" => format!( + match &local_visitor.found_ty { + Some(ty) if &ty[..] != "_" && ty != &name => format!( "the type `{}` with the type parameter `{}` specified", ty, name, @@ -162,18 +163,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { match pattern.span.compiler_desugaring_kind() { None => labels.push(( pattern.span, - format!( - "consider giving `{}` {}", - simple_ident, - match local_visitor.found_ty { - Some(ty) if &ty.to_string() != "_" => format!( - "the type `{}` with the type parameter `{}` specified", - ty, - name, - ), - _ => "a type".to_owned(), - }, - ), + format!("consider giving `{}` a type", simple_ident), )), Some(CompilerDesugaringKind::ForLoop) => labels.push(( pattern.span, @@ -213,15 +203,15 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { span, E0698, "type inside generator must be known in this context"); - err.span_label(span, InferCtxt::missing_type_msg(&name)); + err.span_label(span, InferCtxt::missing_type_msg(&name, "")); err } - fn missing_type_msg(type_name: &str) -> String { + fn missing_type_msg(type_name: &str, postfix: &str) -> String { if type_name == "_" { "cannot infer type".to_owned() } else { - format!("cannot infer type for `{}`", type_name) + format!("cannot infer type for `{}`{}", type_name, postfix) } } } diff --git a/src/test/ui/issues/issue-12187-1.stderr b/src/test/ui/issues/issue-12187-1.stderr index 77aa736873b5..510eeb4b9bbd 100644 --- a/src/test/ui/issues/issue-12187-1.stderr +++ b/src/test/ui/issues/issue-12187-1.stderr @@ -1,4 +1,4 @@ -error[E0282]: type annotations needed for `&_` +error[E0282]: type annotations needed in `&_` --> $DIR/issue-12187-1.rs:6:10 | LL | let &v = new(); diff --git a/src/test/ui/issues/issue-12187-2.stderr b/src/test/ui/issues/issue-12187-2.stderr index 4953c2b11b50..8b12ff5f9d8c 100644 --- a/src/test/ui/issues/issue-12187-2.stderr +++ b/src/test/ui/issues/issue-12187-2.stderr @@ -1,4 +1,4 @@ -error[E0282]: type annotations needed for `&_` +error[E0282]: type annotations needed in `&_` --> $DIR/issue-12187-2.rs:6:10 | LL | let &v = new(); diff --git a/src/test/ui/issues/issue-17551.stderr b/src/test/ui/issues/issue-17551.stderr index 3e99d307b3b6..0d7a31fc60de 100644 --- a/src/test/ui/issues/issue-17551.stderr +++ b/src/test/ui/issues/issue-17551.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `B<_>` +error[E0282]: type annotations needed in `B<_>` --> $DIR/issue-17551.rs:6:15 | LL | let foo = B(marker::PhantomData); - | --- ^ cannot infer type for `T` + | --- ^ cannot infer type for `T` in `B<_>` | | - | consider giving `foo` the type `B<_>` with the type parameter `T` specified + | consider giving `foo` a type error: aborting due to previous error diff --git a/src/test/ui/issues/issue-20261.stderr b/src/test/ui/issues/issue-20261.stderr index c6c3f32dfe7d..c234bce4aaac 100644 --- a/src/test/ui/issues/issue-20261.stderr +++ b/src/test/ui/issues/issue-20261.stderr @@ -1,4 +1,4 @@ -error[E0282]: type annotations needed for `&(_,)` +error[E0282]: type annotations needed in `&(_,)` --> $DIR/issue-20261.rs:4:11 | LL | for (ref i,) in [].iter() { diff --git a/src/test/ui/issues/issue-23046.stderr b/src/test/ui/issues/issue-23046.stderr index 2ce775764045..1363a6f963fe 100644 --- a/src/test/ui/issues/issue-23046.stderr +++ b/src/test/ui/issues/issue-23046.stderr @@ -1,4 +1,4 @@ -error[E0282]: type annotations needed for `Expr<'_, _>` +error[E0282]: type annotations needed in `Expr<'_, _>` --> $DIR/issue-23046.rs:17:15 | LL | let ex = |x| { diff --git a/src/test/ui/issues/issue-25368.stderr b/src/test/ui/issues/issue-25368.stderr index 3b2c3bfe4ff9..5fc9ab269697 100644 --- a/src/test/ui/issues/issue-25368.stderr +++ b/src/test/ui/issues/issue-25368.stderr @@ -1,11 +1,11 @@ -error[E0282]: type annotations needed for `(std::sync::mpsc::Sender>, std::sync::mpsc::Receiver>)` +error[E0282]: type annotations needed in `(std::sync::mpsc::Sender>, std::sync::mpsc::Receiver>)` --> $DIR/issue-25368.rs:11:17 | LL | let (tx, rx) = channel(); | -------- consider giving the pattern a type ... LL | tx.send(Foo{ foo: PhantomData }); - | ^^^ cannot infer type for `T` + | ^^^ cannot infer type for `T` in `(std::sync::mpsc::Sender>, std::sync::mpsc::Receiver>)` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-7813.stderr b/src/test/ui/issues/issue-7813.stderr index 8e2a69dd9e30..7338032098bd 100644 --- a/src/test/ui/issues/issue-7813.stderr +++ b/src/test/ui/issues/issue-7813.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `&[_; 0]` +error[E0282]: type annotations needed in `&[_; 0]` --> $DIR/issue-7813.rs:2:13 | LL | let v = &[]; | - ^^^ cannot infer type | | - | consider giving `v` the type `&[_; 0]` with the type parameter `_` specified + | consider giving `v` a type error: aborting due to previous error diff --git a/src/test/ui/methods/method-ambig-one-trait-unknown-int-type.stderr b/src/test/ui/methods/method-ambig-one-trait-unknown-int-type.stderr index bae675526bd1..e8871efc5b27 100644 --- a/src/test/ui/methods/method-ambig-one-trait-unknown-int-type.stderr +++ b/src/test/ui/methods/method-ambig-one-trait-unknown-int-type.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `std::vec::Vec<_>` +error[E0282]: type annotations needed in `std::vec::Vec<_>` --> $DIR/method-ambig-one-trait-unknown-int-type.rs:24:17 | LL | let mut x = Vec::new(); - | ----- ^^^^^^^^ cannot infer type for `T` + | ----- ^^^^^^^^ cannot infer type for `T` in `std::vec::Vec<_>` | | - | consider giving `x` the type `std::vec::Vec<_>` with the type parameter `T` specified + | consider giving `x` a type error[E0308]: mismatched types --> $DIR/method-ambig-one-trait-unknown-int-type.rs:33:20 diff --git a/src/test/ui/span/issue-42234-unknown-receiver-type.stderr b/src/test/ui/span/issue-42234-unknown-receiver-type.stderr index 9b0d56e38b76..2ae942e48e68 100644 --- a/src/test/ui/span/issue-42234-unknown-receiver-type.stderr +++ b/src/test/ui/span/issue-42234-unknown-receiver-type.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `std::option::Option<_>` +error[E0282]: type annotations needed in `std::option::Option<_>` --> $DIR/issue-42234-unknown-receiver-type.rs:7:5 | LL | let x: Option<_> = None; - | - consider giving `x` the type `std::option::Option<_>` with the type parameter `T` specified + | - consider giving `x` a type LL | x.unwrap().method_that_could_exist_on_some_type(); - | ^^^^^^^^^^ cannot infer type for `T` + | ^^^^^^^^^^ cannot infer type for `T` in `std::option::Option<_>` | = note: type must be known at this point diff --git a/src/test/ui/type/type-check/cannot_infer_local_or_array.stderr b/src/test/ui/type/type-check/cannot_infer_local_or_array.stderr index 115808b3b3e8..d3c726cf8e73 100644 --- a/src/test/ui/type/type-check/cannot_infer_local_or_array.stderr +++ b/src/test/ui/type/type-check/cannot_infer_local_or_array.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `[_; 0]` +error[E0282]: type annotations needed in `[_; 0]` --> $DIR/cannot_infer_local_or_array.rs:2:13 | LL | let x = []; | - ^^ cannot infer type | | - | consider giving `x` the type `[_; 0]` with the type parameter `_` specified + | consider giving `x` a type error: aborting due to previous error diff --git a/src/test/ui/type/type-check/cannot_infer_local_or_vec.stderr b/src/test/ui/type/type-check/cannot_infer_local_or_vec.stderr index 49b4330b51e2..59a8b52a66d3 100644 --- a/src/test/ui/type/type-check/cannot_infer_local_or_vec.stderr +++ b/src/test/ui/type/type-check/cannot_infer_local_or_vec.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `std::vec::Vec<_>` +error[E0282]: type annotations needed in `std::vec::Vec<_>` --> $DIR/cannot_infer_local_or_vec.rs:2:13 | LL | let x = vec![]; - | - ^^^^^^ cannot infer type for `T` + | - ^^^^^^ cannot infer type for `T` in `std::vec::Vec<_>` | | - | consider giving `x` the type `std::vec::Vec<_>` with the type parameter `T` specified + | consider giving `x` a type | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/src/test/ui/type/type-check/cannot_infer_local_or_vec_in_tuples.stderr b/src/test/ui/type/type-check/cannot_infer_local_or_vec_in_tuples.stderr index 57eb185a36af..294b6d93211b 100644 --- a/src/test/ui/type/type-check/cannot_infer_local_or_vec_in_tuples.stderr +++ b/src/test/ui/type/type-check/cannot_infer_local_or_vec_in_tuples.stderr @@ -1,8 +1,8 @@ -error[E0282]: type annotations needed for `(std::vec::Vec<_>,)` +error[E0282]: type annotations needed in `(std::vec::Vec<_>,)` --> $DIR/cannot_infer_local_or_vec_in_tuples.rs:2:18 | LL | let (x, ) = (vec![], ); - | ----- ^^^^^^ cannot infer type for `T` + | ----- ^^^^^^ cannot infer type for `T` in `(std::vec::Vec<_>,)` | | | consider giving the pattern a type | diff --git a/src/test/ui/unboxed-closures/unboxed-closures-failed-recursive-fn-2.stderr b/src/test/ui/unboxed-closures/unboxed-closures-failed-recursive-fn-2.stderr index d0d8aed0cb8d..142975144d47 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-failed-recursive-fn-2.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-failed-recursive-fn-2.stderr @@ -1,8 +1,8 @@ -error[E0282]: type annotations needed for `std::option::Option<_>` +error[E0282]: type annotations needed in `std::option::Option<_>` --> $DIR/unboxed-closures-failed-recursive-fn-2.rs:16:32 | LL | let mut closure0 = None; - | ------------ consider giving `closure0` the type `std::option::Option<_>` with the type parameter `_` specified + | ------------ consider giving `closure0` a type ... LL | return c(); | ^^^ cannot infer type diff --git a/src/test/ui/vector-no-ann.stderr b/src/test/ui/vector-no-ann.stderr index 6aa925e07157..2431927f2ac8 100644 --- a/src/test/ui/vector-no-ann.stderr +++ b/src/test/ui/vector-no-ann.stderr @@ -1,10 +1,10 @@ -error[E0282]: type annotations needed for `std::vec::Vec<_>` +error[E0282]: type annotations needed in `std::vec::Vec<_>` --> $DIR/vector-no-ann.rs:2:16 | LL | let _foo = Vec::new(); - | ---- ^^^^^^^^ cannot infer type for `T` + | ---- ^^^^^^^^ cannot infer type for `T` in `std::vec::Vec<_>` | | - | consider giving `_foo` the type `std::vec::Vec<_>` with the type parameter `T` specified + | consider giving `_foo` a type error: aborting due to previous error