]> git.lizzy.rs Git - rust.git/commitdiff
On `FnDef` type annotation suggestion, use fn-pointer output
authorEsteban Küber <esteban@kuber.com.ar>
Sun, 19 Apr 2020 03:51:11 +0000 (20:51 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Sun, 19 Apr 2020 03:51:11 +0000 (20:51 -0700)
Partly addresses #71209.

src/librustc_infer/infer/error_reporting/need_type_info.rs
src/test/ui/suggestions/fn-needing-specified-return-type-param.rs [new file with mode: 0644]
src/test/ui/suggestions/fn-needing-specified-return-type-param.stderr [new file with mode: 0644]

index bb6e5700ccad4944bb7885e286d87a3b8787b9ec..2b4aeb2138240a9fb6740409afff930f907f1040 100644 (file)
@@ -247,7 +247,13 @@ pub fn need_type_info_err(
                 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 inscludes 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 (file)
index 0000000..2f140f8
--- /dev/null
@@ -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 (file)
index 0000000..b59a381
--- /dev/null
@@ -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`.