| ... | @@ -8111,6 +8111,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no | ... | @@ -8111,6 +8111,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no |
| 8111 | } else { | 8111 | } else { |
| 8112 | payload_scope = subexpr_scope; | 8112 | payload_scope = subexpr_scope; |
| 8113 | } | 8113 | } |
| | 8114 | ScopeExpr *spill_scope = create_expr_scope(irb->codegen, node, payload_scope); |
| 8114 | IrInstSrc *err_val_ptr = ir_gen_node_extra(irb, node->data.while_expr.condition, subexpr_scope, | 8115 | IrInstSrc *err_val_ptr = ir_gen_node_extra(irb, node->data.while_expr.condition, subexpr_scope, |
| 8115 | LValPtr, nullptr); | 8116 | LValPtr, nullptr); |
| 8116 | if (err_val_ptr == irb->codegen->invalid_inst_src) | 8117 | if (err_val_ptr == irb->codegen->invalid_inst_src) |
| ... | @@ -8134,10 +8135,10 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no | ... | @@ -8134,10 +8135,10 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no |
| 8134 | | 8135 | |
| 8135 | ir_set_cursor_at_end_and_append_block(irb, body_block); | 8136 | ir_set_cursor_at_end_and_append_block(irb, body_block); |
| 8136 | if (var_symbol) { | 8137 | if (var_symbol) { |
| 8137 | IrInstSrc *payload_ptr = ir_build_unwrap_err_payload_src(irb, payload_scope, symbol_node, | 8138 | IrInstSrc *payload_ptr = ir_build_unwrap_err_payload_src(irb, &spill_scope->base, symbol_node, |
| 8138 | err_val_ptr, false, false); | 8139 | err_val_ptr, false, false); |
| 8139 | IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ? | 8140 | IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ? |
| 8140 | ir_build_ref_src(irb, payload_scope, symbol_node, payload_ptr, true, false) : payload_ptr; | 8141 | ir_build_ref_src(irb, &spill_scope->base, symbol_node, payload_ptr, true, false) : payload_ptr; |
| 8141 | ir_build_var_decl_src(irb, payload_scope, symbol_node, payload_var, nullptr, var_ptr); | 8142 | ir_build_var_decl_src(irb, payload_scope, symbol_node, payload_var, nullptr, var_ptr); |
| 8142 | } | 8143 | } |
| 8143 | | 8144 | |
| ... | @@ -8152,6 +8153,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no | ... | @@ -8152,6 +8153,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no |
| 8152 | loop_scope->incoming_values = &incoming_values; | 8153 | loop_scope->incoming_values = &incoming_values; |
| 8153 | loop_scope->lval = lval; | 8154 | loop_scope->lval = lval; |
| 8154 | loop_scope->peer_parent = peer_parent; | 8155 | loop_scope->peer_parent = peer_parent; |
| | 8156 | loop_scope->spill_scope = spill_scope; |
| 8155 | | 8157 | |
| 8156 | // Note the body block of the loop is not the place that lval and result_loc are used - | 8158 | // Note the body block of the loop is not the place that lval and result_loc are used - |
| 8157 | // it's actually in break statements, handled similarly to return statements. | 8159 | // it's actually in break statements, handled similarly to return statements. |
| ... | @@ -8247,7 +8249,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no | ... | @@ -8247,7 +8249,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no |
| 8247 | ir_set_cursor_at_end_and_append_block(irb, body_block); | 8249 | ir_set_cursor_at_end_and_append_block(irb, body_block); |
| 8248 | IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, &spill_scope->base, symbol_node, maybe_val_ptr, false, false); | 8250 | IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, &spill_scope->base, symbol_node, maybe_val_ptr, false, false); |
| 8249 | IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ? | 8251 | IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ? |
| 8250 | ir_build_ref_src(irb, child_scope, symbol_node, payload_ptr, true, false) : payload_ptr; | 8252 | ir_build_ref_src(irb, &spill_scope->base, symbol_node, payload_ptr, true, false) : payload_ptr; |
| 8251 | ir_build_var_decl_src(irb, child_scope, symbol_node, payload_var, nullptr, var_ptr); | 8253 | ir_build_var_decl_src(irb, child_scope, symbol_node, payload_var, nullptr, var_ptr); |
| 8252 | | 8254 | |
| 8253 | ZigList<IrInstSrc *> incoming_values = {0}; | 8255 | ZigList<IrInstSrc *> incoming_values = {0}; |