about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2023-01-30 21:55:25 +0000
committerEsteban Küber <esteban@kuber.com.ar>2023-01-30 21:55:25 +0000
commitd86835769c58b5d9599cdb54a90e239ee041189b (patch)
tree2b19a5b62b0ed6098f74d97c48a818b1891cafe2
parent6c2c8edac3f7aa2d2aa779d0683db7f3dd2e9887 (diff)
downloadrust-d86835769c58b5d9599cdb54a90e239ee041189b.tar.gz
rust-d86835769c58b5d9599cdb54a90e239ee041189b.zip
Make structured suggestion for fn casting verbose
-rw-r--r--compiler/rustc_infer/src/infer/error_reporting/suggest.rs2
-rw-r--r--tests/ui/fn/fn-pointer-mismatch.stderr30
-rw-r--r--tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr10
-rw-r--r--tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr10
-rw-r--r--tests/ui/static/static-reference-to-fn-1.stderr9
5 files changed, 36 insertions, 25 deletions
diff --git a/compiler/rustc_infer/src/infer/error_reporting/suggest.rs b/compiler/rustc_infer/src/infer/error_reporting/suggest.rs
index 23063e80b05..73859aca424 100644
--- a/compiler/rustc_infer/src/infer/error_reporting/suggest.rs
+++ b/compiler/rustc_infer/src/infer/error_reporting/suggest.rs
@@ -404,7 +404,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
                         (msg, sug)
                     }
                 };
-                diag.span_suggestion(span, msg, sug, Applicability::MaybeIncorrect);
+                diag.span_suggestion_verbose(span, msg, sug, Applicability::MaybeIncorrect);
             }
             (ty::FnDef(did1, substs1), ty::FnDef(did2, substs2)) => {
                 let expected_sig =
diff --git a/tests/ui/fn/fn-pointer-mismatch.stderr b/tests/ui/fn/fn-pointer-mismatch.stderr
index bed59d4af6d..a674babcb32 100644
--- a/tests/ui/fn/fn-pointer-mismatch.stderr
+++ b/tests/ui/fn/fn-pointer-mismatch.stderr
@@ -43,42 +43,48 @@ error[E0308]: mismatched types
   --> $DIR/fn-pointer-mismatch.rs:36:29
    |
 LL |     let c: fn(u32) -> u32 = &foo;
-   |            --------------   ^^^^
-   |            |                |
-   |            |                expected fn pointer, found `&fn(u32) -> u32 {foo}`
-   |            |                help: consider removing the reference: `foo`
+   |            --------------   ^^^^ expected fn pointer, found `&fn(u32) -> u32 {foo}`
+   |            |
    |            expected due to this
    |
    = note: expected fn pointer `fn(u32) -> u32`
                found reference `&fn(u32) -> u32 {foo}`
+help: consider removing the reference
+   |
+LL |     let c: fn(u32) -> u32 = foo;
+   |                             ~~~
 
 error[E0308]: mismatched types
   --> $DIR/fn-pointer-mismatch.rs:42:30
    |
 LL |     let d: &fn(u32) -> u32 = foo;
-   |            ---------------   ^^^
-   |            |                 |
-   |            |                 expected `&fn(u32) -> u32`, found fn item
-   |            |                 help: consider using a reference: `&foo`
+   |            ---------------   ^^^ expected `&fn(u32) -> u32`, found fn item
+   |            |
    |            expected due to this
    |
    = note: expected reference `&fn(u32) -> u32`
                 found fn item `fn(u32) -> u32 {foo}`
+help: consider using a reference
+   |
+LL |     let d: &fn(u32) -> u32 = &foo;
+   |                              ~~~~
 
 error[E0308]: mismatched types
   --> $DIR/fn-pointer-mismatch.rs:48:30
    |
 LL |     let e: &fn(u32) -> u32 = &foo;
-   |            ---------------   ^^^^
-   |            |                 |
-   |            |                 expected `&fn(u32) -> u32`, found `&fn(u32) -> u32 {foo}`
-   |            |                 help: consider casting to a fn pointer: `&(foo as fn(u32) -> u32)`
+   |            ---------------   ^^^^ expected `&fn(u32) -> u32`, found `&fn(u32) -> u32 {foo}`
+   |            |
    |            expected due to this
    |
    = note: expected reference `&fn(u32) -> u32`
               found reference `&fn(u32) -> u32 {foo}`
    = note: fn items are distinct from fn pointers
    = note: when the arguments and return types match, functions can be coerced to function pointers
+help: consider casting to a fn pointer
+   |
+LL |     let e: &fn(u32) -> u32 = &(foo as fn(u32) -> u32);
+   |                              ~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to 6 previous errors
 
diff --git a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr
index 36561ab91ee..b0ac5dc44ad 100644
--- a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr
+++ b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.mir.stderr
@@ -5,10 +5,8 @@ LL | #[target_feature(enable = "sse2")]
    | ---------------------------------- `#[target_feature]` added here
 ...
 LL |     let foo: fn() = foo;
-   |              ----   ^^^
-   |              |      |
-   |              |      cannot coerce functions with `#[target_feature]` to safe function pointers
-   |              |      help: consider casting to a fn pointer: `foo as fn()`
+   |              ----   ^^^ cannot coerce functions with `#[target_feature]` to safe function pointers
+   |              |
    |              expected due to this
    |
    = note: expected fn pointer `fn()`
@@ -16,6 +14,10 @@ LL |     let foo: fn() = foo;
    = note: fn items are distinct from fn pointers
    = note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers
    = note: when the arguments and return types match, functions can be coerced to function pointers
+help: consider casting to a fn pointer
+   |
+LL |     let foo: fn() = foo as fn();
+   |                     ~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr
index 36561ab91ee..b0ac5dc44ad 100644
--- a/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr
+++ b/tests/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.thir.stderr
@@ -5,10 +5,8 @@ LL | #[target_feature(enable = "sse2")]
    | ---------------------------------- `#[target_feature]` added here
 ...
 LL |     let foo: fn() = foo;
-   |              ----   ^^^
-   |              |      |
-   |              |      cannot coerce functions with `#[target_feature]` to safe function pointers
-   |              |      help: consider casting to a fn pointer: `foo as fn()`
+   |              ----   ^^^ cannot coerce functions with `#[target_feature]` to safe function pointers
+   |              |
    |              expected due to this
    |
    = note: expected fn pointer `fn()`
@@ -16,6 +14,10 @@ LL |     let foo: fn() = foo;
    = note: fn items are distinct from fn pointers
    = note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers
    = note: when the arguments and return types match, functions can be coerced to function pointers
+help: consider casting to a fn pointer
+   |
+LL |     let foo: fn() = foo as fn();
+   |                     ~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/tests/ui/static/static-reference-to-fn-1.stderr b/tests/ui/static/static-reference-to-fn-1.stderr
index a75c7438cb7..b68352b5183 100644
--- a/tests/ui/static/static-reference-to-fn-1.stderr
+++ b/tests/ui/static/static-reference-to-fn-1.stderr
@@ -2,15 +2,16 @@ error[E0308]: mismatched types
   --> $DIR/static-reference-to-fn-1.rs:17:15
    |
 LL |         func: &foo,
-   |               ^^^^
-   |               |
-   |               expected `&fn() -> Option<isize>`, found `&fn() -> Option<isize> {foo}`
-   |               help: consider casting to a fn pointer: `&(foo as fn() -> Option<isize>)`
+   |               ^^^^ expected `&fn() -> Option<isize>`, found `&fn() -> Option<isize> {foo}`
    |
    = note: expected reference `&fn() -> Option<isize>`
               found reference `&fn() -> Option<isize> {foo}`
    = note: fn items are distinct from fn pointers
    = note: when the arguments and return types match, functions can be coerced to function pointers
+help: consider casting to a fn pointer
+   |
+LL |         func: &(foo as fn() -> Option<isize>),
+   |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error