astgen: fix continue and for loop scope handling
- continue: emit check_comptime_control_flow and restore_err_ret_index_unconditional (matching AstGen.zig:2328-2334) - forExpr: set loop_scope.continue_block = cond_block (matching AstGen.zig:6974), allowing continue inside for loops to target the correct scope Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
17
astgen.c
17
astgen.c
@@ -3336,6 +3336,22 @@ static uint32_t exprRl(GenZir* gz, Scope* scope, ResultLoc rl, uint32_t node) {
|
|||||||
ZirInstTag break_tag = gz2->is_inline
|
ZirInstTag break_tag = gz2->is_inline
|
||||||
? ZIR_INST_BREAK_INLINE
|
? ZIR_INST_BREAK_INLINE
|
||||||
: ZIR_INST_BREAK;
|
: ZIR_INST_BREAK;
|
||||||
|
if (break_tag == ZIR_INST_BREAK_INLINE) {
|
||||||
|
// AstGen.zig:2328-2330.
|
||||||
|
addUnNode(gz, ZIR_INST_CHECK_COMPTIME_CONTROL_FLOW,
|
||||||
|
gz2->continue_block + ZIR_REF_START_INDEX, node);
|
||||||
|
}
|
||||||
|
// Restore error return index (AstGen.zig:2333-2334).
|
||||||
|
if (!gz2->is_comptime) {
|
||||||
|
ZirInstData rdata;
|
||||||
|
rdata.un_node.operand
|
||||||
|
= gz2->continue_block + ZIR_REF_START_INDEX;
|
||||||
|
rdata.un_node.src_node
|
||||||
|
= (int32_t)node - (int32_t)gz->decl_node_index;
|
||||||
|
addInstruction(gz,
|
||||||
|
ZIR_INST_RESTORE_ERR_RET_INDEX_UNCONDITIONAL,
|
||||||
|
rdata);
|
||||||
|
}
|
||||||
addBreak(gz, break_tag, gz2->continue_block,
|
addBreak(gz, break_tag, gz2->continue_block,
|
||||||
ZIR_REF_VOID_VALUE,
|
ZIR_REF_VOID_VALUE,
|
||||||
(int32_t)node - (int32_t)gz->decl_node_index);
|
(int32_t)node - (int32_t)gz->decl_node_index);
|
||||||
@@ -4087,6 +4103,7 @@ static uint32_t forExpr(
|
|||||||
uint32_t cond_block = makeBlockInst(ag, block_tag, &loop_scope, node);
|
uint32_t cond_block = makeBlockInst(ag, block_tag, &loop_scope, node);
|
||||||
setBlockBody(ag, &cond_scope, cond_block);
|
setBlockBody(ag, &cond_scope, cond_block);
|
||||||
loop_scope.break_block = loop_inst;
|
loop_scope.break_block = loop_inst;
|
||||||
|
loop_scope.continue_block = cond_block; // AstGen.zig:6974
|
||||||
gzAppendInstruction(&loop_scope, cond_block);
|
gzAppendInstruction(&loop_scope, cond_block);
|
||||||
|
|
||||||
// Then branch: loop body (AstGen.zig:6982-7065).
|
// Then branch: loop body (AstGen.zig:6982-7065).
|
||||||
|
|||||||
Reference in New Issue
Block a user