Fail gracefully if mutating on a use closure and the closure it not declared mut

This commit is contained in:
Santiago Pastorino 2025-02-14 18:42:06 -03:00
parent 6eb6ff62f7
commit aa58439f87
No known key found for this signature in database
GPG key ID: 8131A24E0C79EFAF
3 changed files with 28 additions and 1 deletions

View file

@ -823,7 +823,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
) => {
capture_reason = format!("mutable borrow of `{upvar}`");
}
ty::UpvarCapture::ByValue => {
ty::UpvarCapture::ByValue | ty::UpvarCapture::ByUse => {
capture_reason = format!("possible mutation of `{upvar}`");
}
_ => bug!("upvar `{upvar}` borrowed, but not mutably"),

View file

@ -0,0 +1,10 @@
#![feature(ergonomic_clones)]
fn main() {
let mut my_var = false;
let callback = use || {
my_var = true;
};
callback();
//~^ ERROR cannot borrow `callback` as mutable, as it is not declared as mutable [E0596]
}

View file

@ -0,0 +1,17 @@
error[E0596]: cannot borrow `callback` as mutable, as it is not declared as mutable
--> $DIR/mutation2.rs:8:5
|
LL | my_var = true;
| ------ calling `callback` requires mutable binding due to possible mutation of `my_var`
LL | };
LL | callback();
| ^^^^^^^^ cannot borrow as mutable
|
help: consider changing this to be mutable
|
LL | let mut callback = use || {
| +++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0596`.