about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-04-28 13:12:09 +0200
committerGitHub <noreply@github.com>2020-04-28 13:12:09 +0200
commitd9c1f5cf4f761455024fc7b9dd586b1a669bcb0f (patch)
tree4352b7c8ce84447a51cfced6b5a22f4f157e2a34
parentfb5615a4771ea3d54256f969dc84d2dfd38d812c (diff)
parent432ab343f8c75e657d25713addc2ee0cd5110542 (diff)
downloadrust-d9c1f5cf4f761455024fc7b9dd586b1a669bcb0f.tar.gz
rust-d9c1f5cf4f761455024fc7b9dd586b1a669bcb0f.zip
Rollup merge of #71311 - estebank:fn-type-param, r=varkor
On `FnDef` type annotation suggestion, use fn-pointer output

Address the last point in #71209.
-rw-r--r--src/librustc_infer/infer/error_reporting/need_type_info.rs8
-rw-r--r--src/test/ui/suggestions/fn-needing-specified-return-type-param.rs5
-rw-r--r--src/test/ui/suggestions/fn-needing-specified-return-type-param.stderr11
3 files changed, 23 insertions, 1 deletions
diff --git a/src/librustc_infer/infer/error_reporting/need_type_info.rs b/src/librustc_infer/infer/error_reporting/need_type_info.rs
index 1986838e401..93c8e505697 100644
--- a/src/librustc_infer/infer/error_reporting/need_type_info.rs
+++ b/src/librustc_infer/infer/error_reporting/need_type_info.rs
@@ -257,7 +257,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
                 None
             };
             printer.name_resolver = Some(Box::new(&getter));
-            let _ = ty.print(printer);
+            let _ = if let ty::FnDef(..) = ty.kind {
+                // We don't want the regular output for `fn`s because it includes its path in
+                // invalid pseduo-syntax, we want the `fn`-pointer output instead.
+                ty.fn_sig(self.tcx).print(printer)
+            } else {
+                ty.print(printer)
+            };
             s
         };
 
diff --git a/src/test/ui/suggestions/fn-needing-specified-return-type-param.rs b/src/test/ui/suggestions/fn-needing-specified-return-type-param.rs
new file mode 100644
index 00000000000..2f140f823af
--- /dev/null
+++ b/src/test/ui/suggestions/fn-needing-specified-return-type-param.rs
@@ -0,0 +1,5 @@
+fn f<A>() -> A { unimplemented!() }
+fn foo() {
+    let _ = f; //~ ERROR type annotations needed for `fn() -> A`
+}
+fn main() {}
diff --git a/src/test/ui/suggestions/fn-needing-specified-return-type-param.stderr b/src/test/ui/suggestions/fn-needing-specified-return-type-param.stderr
new file mode 100644
index 00000000000..b59a3818e70
--- /dev/null
+++ b/src/test/ui/suggestions/fn-needing-specified-return-type-param.stderr
@@ -0,0 +1,11 @@
+error[E0282]: type annotations needed for `fn() -> A`
+  --> $DIR/fn-needing-specified-return-type-param.rs:3:13
+   |
+LL |     let _ = f;
+   |         -   ^ cannot infer type for type parameter `A` declared on the function `f`
+   |         |
+   |         consider giving this pattern the explicit type `fn() -> A`, where the type parameter `A` is specified
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0282`.