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 @@ pub(super) fn suggest_function_pointers( (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`, found `&fn() -> Option {foo}` - | help: consider casting to a fn pointer: `&(foo as fn() -> Option)` + | ^^^^ expected `&fn() -> Option`, found `&fn() -> Option {foo}` | = note: expected reference `&fn() -> Option` found reference `&fn() -> Option {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), + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: aborting due to previous error