Commit 237233b04b

Andrew Kelley <andrew@ziglang.org>
2019-06-21 00:15:27
fix coroutines
1 parent 057b105
Changed files (3)
src/codegen.cpp
@@ -3755,7 +3755,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
     bool prefix_arg_err_ret_stack = get_prefix_arg_err_ret_stack(g, fn_type_id);
     bool is_var_args = fn_type_id->is_var_args;
     ZigList<LLVMValueRef> gen_param_values = {};
-    LLVMValueRef result_loc = first_arg_ret ? ir_llvm_value(g, instruction->result_loc) : nullptr;
+    LLVMValueRef result_loc = (first_arg_ret || instruction->is_async) ? ir_llvm_value(g, instruction->result_loc) : nullptr;
     if (first_arg_ret) {
         gen_param_values.append(result_loc);
     }
src/ir.cpp
@@ -15252,8 +15252,14 @@ static IrInstruction *ir_analyze_async_call(IrAnalyze *ira, IrInstructionCallSrc
     ZigType *promise_type = get_promise_type(ira->codegen, return_type);
     ZigType *async_return_type = get_error_union_type(ira->codegen, alloc_fn_error_set_type, promise_type);
 
+    IrInstruction *result_loc = ir_resolve_result(ira, &call_instruction->base, no_result_loc(),
+            async_return_type, nullptr, true, true);
+    if (type_is_invalid(result_loc->value.type) || instr_is_unreachable(result_loc)) {
+        return result_loc;
+    }
+
     return ir_build_call_gen(ira, &call_instruction->base, fn_entry, fn_ref, arg_count,
-            casted_args, FnInlineAuto, true, async_allocator_inst, nullptr, nullptr,
+            casted_args, FnInlineAuto, true, async_allocator_inst, nullptr, result_loc,
             async_return_type);
 }
 
test/stage1/behavior.zig
@@ -39,11 +39,11 @@ comptime {
     _ = @import("behavior/bugs/828.zig");
     _ = @import("behavior/bugs/920.zig");
     _ = @import("behavior/byval_arg_var.zig");
-    //_ = @import("behavior/cancel.zig");
+    _ = @import("behavior/cancel.zig");
     _ = @import("behavior/cast.zig");
     _ = @import("behavior/const_slice_child.zig");
-    //_ = @import("behavior/coroutine_await_struct.zig");
-    //_ = @import("behavior/coroutines.zig");
+    _ = @import("behavior/coroutine_await_struct.zig");
+    _ = @import("behavior/coroutines.zig");
     _ = @import("behavior/defer.zig");
     _ = @import("behavior/enum.zig");
     _ = @import("behavior/enum_with_members.zig");