authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-21 17:17:44-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-21 17:17:44-04:00
log56c08eb3025a622e5d3f5b2b6c704f8dc2cddf47
tree4adcc5db1331c22529421c2798de3efb81589e29
parent6053ca4f69e490c744384bd02e89df595ff7b085
signature Commit is signed but in an unrecognized format.

returning from async fn adds bad resume safety


1 files changed, 8 insertions(+), 0 deletions(-)

src/codegen.cpp+8
......@@ -2102,6 +2102,14 @@ static LLVMValueRef ir_render_save_err_ret_addr(CodeGen *g, IrExecutable *execut
21022102
21032103static LLVMValueRef ir_render_return(CodeGen *g, IrExecutable *executable, IrInstructionReturn *return_instruction) {
21042104 if (g->cur_fn->resume_blocks.length != 0) {
2105 if (ir_want_runtime_safety(g, &return_instruction->base)) {
2106 LLVMValueRef locals_ptr = g->cur_ret_ptr;
2107 LLVMValueRef resume_index_ptr = LLVMBuildStructGEP(g->builder, locals_ptr, coro_resume_index_index, "");
2108 LLVMValueRef new_resume_index = LLVMConstInt(g->builtin_types.entry_usize->llvm_type,
2109 g->cur_fn->resume_blocks.length + 2, false);
2110 LLVMBuildStore(g->builder, new_resume_index, resume_index_ptr);
2111 }
2112
21052113 LLVMBuildRet(g->builder, LLVMGetUndef(g->builtin_types.entry_usize->llvm_type));
21062114 return nullptr;
21072115 }