Description
This can be sort-of considered a tracking issue for the implementation of rust-lang/rfcs#2025
Right now, two phase borrow support can only handle the very simple case where there is exactly one activation point. In particular, this means we can't expose two-phase borrows to user code since the following wouldn't work:
let x = &mut some_val;
if some_cond {
*x = 1;
} else {
*x = 2;
}
We also intentionally limit two-phase borrows to a very narrow subset of its possible applications; specifically cases where the compiler is injecting mutable auto borrows which are used as method/function parameters. In practice, this covers the following cases:
- using
x.some_method()
syntax, where some_method takes &mut self - using
Foo::some_method(&mut x, ...)
syntax - binary assignment operators (+=, -=, *=, etc.) Note this does /not/ include
IndexMut
operations at this time
Basically, things that desugar to method calls with a mutable self parameter with the exception of IndexMut
. The intention with these restrictions is leverage two-phase borrows to make MIR borrowck accept AST borrowck can, without introducing too much new flexibility (ref #48431 for a more detailed discussion of how and why this came to be). The eventual intention (per rust-lang/rfcs#2025) is to extend this to the general case outlined above, which is what this issue tracks.