@@ -246,14 +246,20 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
246246 } )
247247 }
248248 ExprKind :: LoopMatch { state, region_scope, match_span, ref arms } => {
249- // FIXME add diagram
249+ // Intuitively, this is a combination of a loop containing a labeled block
250+ // containing a match.
251+ //
252+ // The only new bit here is that the lowering of the match is wrapped in a
253+ // `in_const_continuable_scope`, which makes the match arms and their target basic
254+ // block available to the lowering of `#[const_continue]`.
250255
251256 let loop_block = this. cfg . start_new_block ( ) ;
252257
253258 // Start the loop.
254259 this. cfg . goto ( block, source_info, loop_block) ;
255260
256261 this. in_breakable_scope ( Some ( loop_block) , destination, expr_span, |this| {
262+ // logic for `loop`
257263 let mut body_block = this. cfg . start_new_block ( ) ;
258264 this. cfg . terminate (
259265 loop_block,
@@ -265,6 +271,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
265271 ) ;
266272 this. diverge_from ( loop_block) ;
267273
274+ // logic for `match`
268275 let scrutinee_place_builder =
269276 unpack ! ( body_block = this. as_place_builder( body_block, state) ) ;
270277 let scrutinee_span = this. thir . exprs [ state] . span ;
@@ -282,6 +289,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
282289 patterns. push ( ( & * arm. pattern , HasMatchGuard :: No ) ) ;
283290 }
284291
292+ // The `built_tree` maps match arms to their basic block (where control flow
293+ // jumps to when a value matches the arm). This structure is stored so that a
294+ // #[const_continue] can figure out what basic block to jump to.
285295 let built_tree = this. lower_match_tree (
286296 body_block,
287297 scrutinee_span,
@@ -293,6 +303,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
293303
294304 let state_place = scrutinee_place_builder. to_place ( this) ;
295305
306+ // this is logic for the labeled block: a block is a drop scope, hence
307+ // `in_scope`, and a labeled block can be broken out of with a `break 'label`,
308+ // hence the `in_breakable_scope`.
309+ //
310+ // Inside of that information for #[const_continue] is stored, and the match is
311+ // lowered in the standard way.
296312 unpack ! (
297313 body_block = this. in_scope(
298314 ( region_scope, source_info) ,
0 commit comments