Expand description
Code related to match expressions. These are sufficiently complex to warrant their own module and submodules. :) This main module includes the high-level algorithm, the submodules contain the details.
This also includes code for pattern bindings in let
statements and
function parameters.
Modules§
Structs§
ArmHasGuard
is a wrapper around a boolean flag. It indicates whether a match arm has a guard expression attached to it.- Indicates that the type of
source
must be a subtype of the user-given typeuser_ty
; this is basically a no-op but can influence region inference. - Binding 🔒
- The result of generating MIR for a pattern-matching expression. Each input branch/arm/pattern gives rise to an output
MatchTreeBranch
. If one of the patterns matches, we branch to the correspondingsuccess_block
. If none of the patterns matches, we branch tootherwise_block
. - Candidates are a generalization of (a) top-level match arms, and (b) sub-branches of or-patterns, allowing the match-lowering process to handle them both in a mostly-uniform way. For example, the list of candidates passed to
Builder::match_candidates
will often contain a mixture of top-level candidates and or-pattern subcandidates. - FlatPat 🔒A pattern in a form suitable for lowering the match tree, with all irrefutable patterns simplified away, and or-patterns sorted to the end.
- Node in a tree of “match pairs”, where each pair consists of a place to be tested, and a test to perform on that place.
- A branch in the output of match lowering.
- A sub-branch in the output of match lowering. Match lowering has generated MIR code that will branch to
success_block
when the matched value matches the corresponding pattern. If there is a guard, its failure must continue tootherwise_block
, which will resume testing patterns. - Data extracted from a pattern that doesn’t affect which branch is taken. Collected during pattern simplification and not mutated later.
- Test 🔒A test to perform to determine which
Candidate
matches a value. - Arguments to
Builder::then_else_break_inner
that are usually forwarded to recursive invocations.
Enums§
- Should lowering a
let
expression also declare its bindings? - Used by
Builder::bind_matched_candidate_for_arm_body
to determine whether or not to callBuilder::storage_live_binding
to emitStatementKind::StorageLive
. - Used by
Builder::storage_live_binding
andBuilder::bind_matched_candidate_for_arm_body
to decide whether to schedule drops. - The branch to be taken after a test.
- Test
Case 🔒Partial summary of athir::Pat
, indicating what sort of test should be performed to match/reject the pattern, and what the desired test outcome is. This avoids having to perform a full match onthir::PatKind
in some places, and helpsTestKind::Switch
andTestKind::SwitchInt
know what target values to use. - Test
Kind 🔒SeeTest
for more.
Functions§
- A depth-first traversal of the
Candidate
and all of its recursive subcandidates.