Skip to content

Commit 1a1afd7

Browse files
committed
Handle case of moving into vec with uninferred lifetime
1 parent 2c5f2df commit 1a1afd7

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/librustc/infer/error_reporting/mod.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,15 +1079,23 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
10791079
node: hir::ExprClosure(_, _, _, closure_span, false),
10801080
..
10811081
}) => {
1082-
let sp = var_origin.span();
1082+
let sup_sp = sup_origin.span();
1083+
let origin_sp = var_origin.span();
10831084
let mut err = self.tcx.sess.struct_span_err(
1084-
sp,
1085+
sup_sp,
10851086
"borrowed data cannot be moved outside of its closure");
1086-
err.span_label(sp, "cannot be moved outside of its closure");
1087-
err.span_label(*external_span,
1088-
"borrowed data cannot be moved into here...");
1089-
err.span_label(*closure_span,
1090-
"...because it cannot outlive this closure");
1087+
err.span_label(sup_sp, "cannot be moved outside of its closure");
1088+
if sup_sp == origin_sp {
1089+
err.span_label(*external_span,
1090+
"borrowed data cannot be moved into here...");
1091+
err.span_label(*closure_span,
1092+
"...because it cannot outlive this closure");
1093+
} else {
1094+
err.span_label(*closure_span,
1095+
"borrowed data cannot outlive this closure");
1096+
err.span_label(origin_sp,
1097+
"cannot infer an appropriate lifetime");
1098+
}
10911099
err.emit();
10921100
return;
10931101
}

src/test/compile-fail/issue-7573.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ impl CrateId {
2525

2626
pub fn remove_package_from_database() {
2727
let mut lines_to_use: Vec<&CrateId> = Vec::new();
28-
//~^ ERROR borrowed data cannot be moved outside of its closure
28+
//~^ NOTE cannot infer an appropriate lifetime
2929
let push_id = |installed_id: &CrateId| {
30+
//~^ NOTE borrowed data cannot outlive this closure
3031
lines_to_use.push(installed_id);
32+
//~^ ERROR borrowed data cannot be moved outside of its closure
33+
//~| NOTE cannot be moved outside of its closure
3134
};
3235
list_database(push_id);
3336

0 commit comments

Comments
 (0)