diff --git a/src/mir/builder/loops.rs b/src/mir/builder/loops.rs index 138f5092..3d9e7594 100644 --- a/src/mir/builder/loops.rs +++ b/src/mir/builder/loops.rs @@ -26,3 +26,13 @@ pub(crate) fn current_header(builder: &super::MirBuilder) -> Option Option { builder.loop_exit_stack.last().copied() } + +/// Returns true if the builder is currently inside at least one loop context. +pub(crate) fn in_loop(builder: &super::MirBuilder) -> bool { + !builder.loop_header_stack.is_empty() +} + +/// Current loop nesting depth (0 means not in a loop). +pub(crate) fn depth(builder: &super::MirBuilder) -> usize { + builder.loop_header_stack.len() +} diff --git a/src/mir/loop_builder.rs b/src/mir/loop_builder.rs index 7fcebe38..6f1ed4ce 100644 --- a/src/mir/loop_builder.rs +++ b/src/mir/loop_builder.rs @@ -537,18 +537,11 @@ impl<'a> LoopBuilder<'a> { ASTNode::Break { .. } => { // Jump to loop exit (after_loop_id) if available let cur_block = self.current_block()?; - // Ensure parent has recorded current loop exit; if not, record now - if crate::mir::builder::loops::current_exit(self.parent_builder).is_none() { - // Determine after_loop by peeking the next id used earlier: - // In this builder, after_loop_id was created above; record it for nested lowering - // We approximate by using the next block id minus 1 (after_loop) which we set below before branch - } - if let Some(exit_bb) = crate::mir::builder::loops::current_exit(self.parent_builder) - { + if let Some(exit_bb) = crate::mir::builder::loops::current_exit(self.parent_builder) { self.emit_jump(exit_bb)?; let _ = self.add_predecessor(exit_bb, cur_block); } - // Keep building in a fresh (unreachable) block to satisfy callers + // Continue building in a fresh (unreachable) block to satisfy callers let next_block = self.new_block(); self.set_current_block(next_block)?; let void_id = self.new_value();