]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc/middle/ty.rs
Rollup merge of #24072 - ebfull:explain_closure_type_err, r=pnkfelix
[rust.git] / src / librustc / middle / ty.rs
index 952996c90f52e79d82c5ee31ac1c608eee61da0f..0a747ba881fd62f00297e9a071f131164fd9f7c4 100644 (file)
@@ -5103,7 +5103,7 @@ pub fn type_err_to_str<'tcx>(cx: &ctxt<'tcx>, err: &type_err<'tcx>) -> String {
     }
 }
 
-pub fn note_and_explain_type_err(cx: &ctxt, err: &type_err) {
+pub fn note_and_explain_type_err<'tcx>(cx: &ctxt<'tcx>, err: &type_err<'tcx>, sp: Span) {
     match *err {
         terr_regions_does_not_outlive(subregion, superregion) => {
             note_and_explain_region(cx, "", subregion, "...");
@@ -5134,6 +5134,16 @@ pub fn note_and_explain_type_err(cx: &ctxt, err: &type_err) {
                                     "expected concrete lifetime is ",
                                     conc_region, "");
         }
+        terr_sorts(values) => {
+            let expected_str = ty_sort_string(cx, values.expected);
+            let found_str = ty_sort_string(cx, values.found);
+            if expected_str == found_str && expected_str == "closure" {
+                cx.sess.span_note(sp, &format!("no two closures, even if identical, have the same \
+                                                type"));
+                cx.sess.span_help(sp, &format!("consider boxing your closure and/or \
+                                        using it as a trait object"));
+            }
+        }
         _ => {}
     }
 }