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 Desugaring

We can now simply transform:

#![allow(unused)]
fn main() {
match $place {
    $pat1 if $guard1 => $arm1,
    $pat2 if $guard2 => $arm2,
    $pat3 => $arm3,
}
}

into:

#![allow(unused)]
fn main() {
if let $pat1 = $place && $guard1 {
    $arm1
} else if let $pat2 = $place && $guard2 {
    $arm2
} else if let $pat3 = $place {
    $arm3
} else {
    unsafe { core::hint::unreachable_unchecked() }
}
}

This is valid because 1. the scrutinee of the match has been turned into a side-effect-less place expression, and 2. we've dealt with any trickiness around guards, either related to or-patterns or to bindings.

If there are no arms, we emit:

#![allow(unused)]
fn main() {
let _ = $place;
unsafe { core::hint::unreachable_unchecked() }
}

At the end of this step the only remaining branching and pattern construct is if let else.