Commit 2f239e3dbd

Benjamin Feng <benjamin.feng@glassdoor.com>
2020-01-29 06:35:11
Add a spill to while optional
1 parent 13259ac
Changed files (1)
src
src/ir.cpp
@@ -8222,6 +8222,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
         ZigVar *payload_var = ir_create_var(irb, symbol_node, subexpr_scope, var_symbol,
                 true, false, false, is_comptime);
         Scope *child_scope = payload_var->child_scope;
+        ScopeExpr *spill_scope = create_expr_scope(irb->codegen, node, child_scope);
         IrInstSrc *maybe_val_ptr = ir_gen_node_extra(irb, node->data.while_expr.condition, subexpr_scope,
                 LValPtr, nullptr);
         if (maybe_val_ptr == irb->codegen->invalid_inst_src)
@@ -8244,7 +8245,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
                 is_comptime);
 
         ir_set_cursor_at_end_and_append_block(irb, body_block);
-        IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, child_scope, symbol_node, maybe_val_ptr, false, false);
+        IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, &spill_scope->base, symbol_node, maybe_val_ptr, false, false);
         IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ?
             ir_build_ref_src(irb, child_scope, symbol_node, payload_ptr, true, false) : payload_ptr;
         ir_build_var_decl_src(irb, child_scope, symbol_node, payload_var, nullptr, var_ptr);
@@ -8260,6 +8261,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
         loop_scope->incoming_values = &incoming_values;
         loop_scope->lval = lval;
         loop_scope->peer_parent = peer_parent;
+        loop_scope->spill_scope = spill_scope;
 
         // Note the body block of the loop is not the place that lval and result_loc are used -
         // it's actually in break statements, handled similarly to return statements.