Skip to content

Commit

Permalink
Rollup merge of rust-lang#123379 - wutchzone:119266, r=compiler-errors
Browse files Browse the repository at this point in the history
Print note with closure signature on type mismatch

Fixes rust-lang#119266

r? Nilstrieb
  • Loading branch information
jieyouxu authored Apr 20, 2024
2 parents 8cf135e + be564a8 commit b15ad39
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 2 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_errors/src/diagnostic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,7 @@ impl<'a, G: EmissionGuarantee> Diag<'a, G> {
} }

#[rustc_lint_diagnostics]
fn highlighted_note(&mut self, msg: Vec<StringPart>) -> &mut Self {
pub fn highlighted_note(&mut self, msg: Vec<StringPart>) -> &mut Self {
self.sub_with_highlights(Level::Note, msg, MultiSpan::new());
self
}
Expand Down
19 changes: 18 additions & 1 deletion compiler/rustc_infer/src/infer/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ use crate::traits::{
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
use rustc_errors::{
codes::*, pluralize, struct_span_code_err, Applicability, Diag, DiagCtxt, DiagStyledString,
ErrorGuaranteed, IntoDiagArg,
ErrorGuaranteed, IntoDiagArg, StringPart,
};
use rustc_hir as hir;
use rustc_hir::def::DefKind;
Expand Down Expand Up @@ -1917,6 +1917,23 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
);
if !is_simple_error || terr.must_include_note() {
diag.note_expected_found(&expected_label, expected, &found_label, found);

if let Some(ty::Closure(_, args)) =
exp_found.map(|expected_type_found| expected_type_found.found.kind())
{
diag.highlighted_note(vec![
StringPart::normal("closure has signature: `"),
StringPart::highlighted(
self.tcx
.signature_unclosure(
args.as_closure().sig(),
rustc_hir::Unsafety::Normal,
)
.to_string(),
),
StringPart::normal("`"),
]);
}
}
}
}
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/inference/hint-closure-signature-119266.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
fn main() {
let x = |a: u8, b: (usize, u32), c: fn() -> char| -> String { "I love beans.".to_string() };
//~^ NOTE: the found closure

let x: fn(i32) = x;
//~^ ERROR: 5:22: 5:23: mismatched types [E0308]
//~| NOTE: incorrect number of function parameters
//~| NOTE: expected due to this
//~| NOTE: expected fn pointer `fn(i32)`
//~| NOTE: closure has signature: `fn(u8, (usize, u32), fn() -> char) -> String`
}
18 changes: 18 additions & 0 deletions tests/ui/inference/hint-closure-signature-119266.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
error[E0308]: mismatched types
--> $DIR/hint-closure-signature-119266.rs:5:22
|
LL | let x = |a: u8, b: (usize, u32), c: fn() -> char| -> String { "I love beans.".to_string() };
| --------------------------------------------------- the found closure
...
LL | let x: fn(i32) = x;
| ------- ^ incorrect number of function parameters
| |
| expected due to this
|
= note: expected fn pointer `fn(i32)`
found closure `{closure@$DIR/hint-closure-signature-119266.rs:2:13: 2:64}`
= note: closure has signature: `fn(u8, (usize, u32), fn() -> char) -> String`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0308`.

0 comments on commit b15ad39

Please sign in to comment.