Support mutable captures in move expressions
The Issue & Context
Before this PR, Rust's move expressions (like move closures and async blocks) did not support capturing variables mutably, which limited the ability to mutate captured variables inside these constructs.
Root Cause Analysis
The compiler's AST lowering and capture analysis in rustc_ast_lowering/src/expr.rs did not handle mutable captures in move expressions, preventing the compiler from permitting mutable borrows of captured variables in these contexts.
Solution Strategy & Architectural Pattern
This PR updated the lowering logic in rustc_ast_lowering/src/expr.rs to recognize and allow mutable captures in move expressions. It also added extensive UI tests across multiple files (including plain closures, async blocks, async closures, generator blocks, and nested move expressions) to verify that mutable captures are now correctly supported and produce expected diagnostics.
Key Takeaway for Contributors
Language features that interact with variable capture semantics often require coordinated changes in the compiler's AST lowering and borrow checking phases, and thorough testing across different expression forms is crucial to ensure consistent behavior.