Skip to content

Commit

Permalink
Auto merge of rust-lang#81717 - Aaron1011:fix/closure-diag, r=estebank
Browse files Browse the repository at this point in the history
Fix panic when emitting diagnostic for closure mutable binding error

Fixes rust-lang#81700

The upvar borrow kind may be `ty::BorrowKind::UniqueImmBorrow`, which is
still a mutable borrow for the purposes of this diagnostic code.
  • Loading branch information
bors committed Feb 3, 2021
2 parents 120b2a7 + bc84e21 commit e708cbd
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -514,15 +514,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
let upvar = ty::place_to_string_for_capture(tcx, place);
match tables.upvar_capture(upvar_id) {
ty::UpvarCapture::ByRef(ty::UpvarBorrow {
kind: ty::BorrowKind::MutBorrow,
kind: ty::BorrowKind::MutBorrow | ty::BorrowKind::UniqueImmBorrow,
..
}) => {
format!("mutable borrow of `{}`", upvar)
}
ty::UpvarCapture::ByValue(_) => {
format!("possible mutation of `{}`", upvar)
}
_ => bug!("upvar `{}` borrowed, but not mutably", upvar),
val => bug!("upvar `{}` borrowed, but not mutably: {:?}", upvar, val),
}
} else {
bug!("not an upvar")
Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/closures/issue-81700-mut-borrow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
fn foo(x: &mut u32) {
let bar = || { foo(x); };
bar(); //~ ERROR cannot borrow
}
fn main() {}
13 changes: 13 additions & 0 deletions src/test/ui/closures/issue-81700-mut-borrow.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error[E0596]: cannot borrow `bar` as mutable, as it is not declared as mutable
--> $DIR/issue-81700-mut-borrow.rs:3:5
|
LL | let bar = || { foo(x); };
| --- - calling `bar` requires mutable binding due to mutable borrow of `x`
| |
| help: consider changing this to be mutable: `mut bar`
LL | bar();
| ^^^ cannot borrow as mutable

error: aborting due to previous error

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

0 comments on commit e708cbd

Please sign in to comment.