| ... | ... | @@ -964,7 +964,14 @@ fn analyzeBodyInner( |
| 964 | 964 | break sema.zirBreak(block, inst); |
| 965 | 965 | } |
| 966 | 966 | }, |
| 967 | | .break_inline => break inst, |
| 967 | .break_inline => { |
| 968 | if (block.is_comptime) { |
| 969 | break inst; |
| 970 | } else { |
| 971 | sema.comptime_break_inst = inst; |
| 972 | return error.ComptimeBreak; |
| 973 | } |
| 974 | }, |
| 968 | 975 | .repeat => { |
| 969 | 976 | if (block.is_comptime) { |
| 970 | 977 | // Send comptime control flow back to the beginning of this block. |
| ... | ... | @@ -3572,8 +3579,20 @@ fn resolveBlockBody( |
| 3572 | 3579 | if (child_block.is_comptime) { |
| 3573 | 3580 | return sema.resolveBody(child_block, body, body_inst); |
| 3574 | 3581 | } else { |
| 3575 | | _ = try sema.analyzeBody(child_block, body); |
| 3576 | | return sema.analyzeBlockBody(parent_block, src, child_block, merges); |
| 3582 | if (sema.analyzeBodyInner(child_block, body)) |_| { |
| 3583 | return sema.analyzeBlockBody(parent_block, src, child_block, merges); |
| 3584 | } else |err| switch (err) { |
| 3585 | error.ComptimeBreak => { |
| 3586 | const break_inst = sema.comptime_break_inst; |
| 3587 | const break_data = sema.code.instructions.items(.data)[break_inst].@"break"; |
| 3588 | if (break_data.block_inst == body_inst) { |
| 3589 | return sema.resolveInst(break_data.operand); |
| 3590 | } else { |
| 3591 | return error.ComptimeBreak; |
| 3592 | } |
| 3593 | }, |
| 3594 | else => |e| return e, |
| 3595 | } |
| 3577 | 3596 | } |
| 3578 | 3597 | } |
| 3579 | 3598 | |