Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Match Guard Mutable Bindings

Match guards are only allowed shared-reference access to the variables bound in the branch. In the previous step we dealt with by-value bindings. In this step we deal with by-mutable-reference bindings, using let place and If Let Guards again.

Let $pat be a pattern that has a ref mut x binding. We desugar this as follows:

#![allow(unused)]
fn main() {
match .. {
    $pat if $guard => $arm,
    ..
}

// becomes
match .. {
    // To give only shared-access but have `x` keep its type, we use the little trick again:
    $pat if let x1 = &x && let place x = *x1 && $guard => {
        $arm
    }
    ..
}
}

After this step, guards no longer need special handling around bindings.


Discussion

Modifying discriminants in match guards

Guards actually have another mutability restriction: for soundness they must not be allowed to modify any discriminant that participates in the match.

In rustc this is enforced using borrow-checker tricks. This desugaring ignores that entirely; see also Borrow Checking.