Skip to content

Tracking issue for generalized two-phase borrows #49434

Open
@sapphire-arches

Description

@sapphire-arches

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.

Metadata

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: An issue tracking the progress of sth. like the implementation of an RFCNLL-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