From 6eb6ff62f78560720f6902421dcd482cb70482ed Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 14 Feb 2025 18:35:43 -0300 Subject: [PATCH] Allow to mutate use captures --- compiler/rustc_borrowck/src/lib.rs | 20 ++++++++++++------- tests/ui/ergonomic-clones/closure/mutation.rs | 11 ++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 tests/ui/ergonomic-clones/closure/mutation.rs diff --git a/compiler/rustc_borrowck/src/lib.rs b/compiler/rustc_borrowck/src/lib.rs index 68e0ab0933e6..64a533e05ffd 100644 --- a/compiler/rustc_borrowck/src/lib.rs +++ b/compiler/rustc_borrowck/src/lib.rs @@ -1490,14 +1490,20 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> { let stmt = &bbd.statements[loc.statement_index]; debug!("temporary assigned in: stmt={:?}", stmt); - if let StatementKind::Assign(box (_, Rvalue::Ref(_, _, source))) = stmt.kind - { - propagate_closure_used_mut_place(self, source); - } else { - bug!( - "closures should only capture user variables \ + match stmt.kind { + StatementKind::Assign(box ( + _, + Rvalue::Ref(_, _, source) + | Rvalue::Use(Operand::Copy(source) | Operand::Move(source)), + )) => { + propagate_closure_used_mut_place(self, source); + } + _ => { + bug!( + "closures should only capture user variables \ or references to user variables" - ); + ); + } } } _ => propagate_closure_used_mut_place(self, place), diff --git a/tests/ui/ergonomic-clones/closure/mutation.rs b/tests/ui/ergonomic-clones/closure/mutation.rs new file mode 100644 index 000000000000..2e2f0dddf80a --- /dev/null +++ b/tests/ui/ergonomic-clones/closure/mutation.rs @@ -0,0 +1,11 @@ +//@ check-pass + +#![feature(ergonomic_clones)] + +fn main() { + let mut my_var = false; + let mut callback = use || { + my_var = true; + }; + callback(); +}