}
}
-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, "...");
"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"));
+ }
+ }
_ => {}
}
}