Skip to content

Commit 6eb6ff6

Browse files
committed
Allow to mutate use captures
1 parent 292aa87 commit 6eb6ff6

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

compiler/rustc_borrowck/src/lib.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,14 +1490,20 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> {
14901490
let stmt = &bbd.statements[loc.statement_index];
14911491
debug!("temporary assigned in: stmt={:?}", stmt);
14921492

1493-
if let StatementKind::Assign(box (_, Rvalue::Ref(_, _, source))) = stmt.kind
1494-
{
1495-
propagate_closure_used_mut_place(self, source);
1496-
} else {
1497-
bug!(
1498-
"closures should only capture user variables \
1493+
match stmt.kind {
1494+
StatementKind::Assign(box (
1495+
_,
1496+
Rvalue::Ref(_, _, source)
1497+
| Rvalue::Use(Operand::Copy(source) | Operand::Move(source)),
1498+
)) => {
1499+
propagate_closure_used_mut_place(self, source);
1500+
}
1501+
_ => {
1502+
bug!(
1503+
"closures should only capture user variables \
14991504
or references to user variables"
1500-
);
1505+
);
1506+
}
15011507
}
15021508
}
15031509
_ => propagate_closure_used_mut_place(self, place),
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//@ check-pass
2+
3+
#![feature(ergonomic_clones)]
4+
5+
fn main() {
6+
let mut my_var = false;
7+
let mut callback = use || {
8+
my_var = true;
9+
};
10+
callback();
11+
}

0 commit comments

Comments
 (0)