Skip to content

Tracking issue for generalized two-phase borrows #49434

Open

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    A-NLLArea: Non-lexical lifetimes (NLL)C-enhancementCategory: An issue proposing an enhancement or a PR with one.C-tracking-issueCategory: A tracking issue for an RFC or an unstable feature.NLL-completeWorking towards the "valid code works" goalP-mediumMedium priorityS-tracking-design-concernsStatus: There are blocking ❌ design concerns.T-typesRelevant to the types team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions