authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-08 19:08:41-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-08 19:08:41-04:00
log614cab5d68176ea56e48195d04997738297429a1
tree7d430331b69291937b2c58918999ef5fde4f3df1
parentda56959a9a7dd7b83a8d2bc6b1454ae546a48be6
signature Commit is signed but in an unrecognized format.

fix passing string literals to async functions


3 files changed, 32 insertions(+), 6 deletions(-)

src/all_types.hpp+1
......@@ -3763,6 +3763,7 @@ struct FnWalkAttrs {
37633763
37643764struct FnWalkCall {
37653765 ZigList<LLVMValueRef> *gen_param_values;
3766 ZigList<ZigType *> *gen_param_types;
37663767 IrInstructionCallGen *inst;
37673768 bool is_var_args;
37683769};
src/codegen.cpp+10-6
......@@ -1575,14 +1575,14 @@ static LLVMRealPredicate cmp_op_to_real_predicate(IrBinOp cmp_op) {
15751575 }
15761576}
15771577
1578static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_type,
1578static void gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_type,
15791579 LLVMValueRef value)
15801580{
15811581 assert(ptr_type->id == ZigTypeIdPointer);
15821582 ZigType *child_type = ptr_type->data.pointer.child_type;
15831583
15841584 if (!type_has_bits(child_type))
1585 return nullptr;
1585 return;
15861586
15871587 if (handle_is_ptr(child_type)) {
15881588 assert(LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMPointerTypeKind);
......@@ -1602,13 +1602,13 @@ static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_ty
16021602 ZigLLVMBuildMemCpy(g->builder, dest_ptr, align_bytes, src_ptr, align_bytes,
16031603 LLVMConstInt(usize->llvm_type, size_bytes, false),
16041604 ptr_type->data.pointer.is_volatile);
1605 return nullptr;
1605 return;
16061606 }
16071607
16081608 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
16091609 if (host_int_bytes == 0) {
16101610 gen_store(g, value, ptr, ptr_type);
1611 return nullptr;
1611 return;
16121612 }
16131613
16141614 bool big_endian = g->is_big_endian;
......@@ -1638,7 +1638,7 @@ static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_ty
16381638 LLVMValueRef ored_value = LLVMBuildOr(g->builder, shifted_value, anded_containing_int, "");
16391639
16401640 gen_store(g, ored_value, ptr, ptr_type);
1641 return nullptr;
1641 return;
16421642}
16431643
16441644static void gen_var_debug_decl(CodeGen *g, ZigVar *var) {
......@@ -1958,6 +1958,7 @@ void walk_function_params(CodeGen *g, ZigType *fn_type, FnWalk *fn_walk) {
19581958 LLVMValueRef param_value = ir_llvm_value(g, param_instruction);
19591959 assert(param_value);
19601960 fn_walk->data.call.gen_param_values->append(param_value);
1961 fn_walk->data.call.gen_param_types->append(param_type);
19611962 }
19621963 }
19631964 return;
......@@ -3821,6 +3822,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
38213822 bool prefix_arg_err_ret_stack = codegen_fn_has_err_ret_tracing_arg(g, fn_type_id->return_type);
38223823 bool is_var_args = fn_type_id->is_var_args;
38233824 ZigList<LLVMValueRef> gen_param_values = {};
3825 ZigList<ZigType *> gen_param_types = {};
38243826 LLVMValueRef result_loc = instruction->result_loc ? ir_llvm_value(g, instruction->result_loc) : nullptr;
38253827 LLVMValueRef zero = LLVMConstNull(usize_type_ref);
38263828 LLVMValueRef frame_result_loc;
......@@ -3923,6 +3925,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
39233925 fn_walk.data.call.inst = instruction;
39243926 fn_walk.data.call.is_var_args = is_var_args;
39253927 fn_walk.data.call.gen_param_values = &gen_param_values;
3928 fn_walk.data.call.gen_param_types = &gen_param_types;
39263929 walk_function_params(g, fn_type, &fn_walk);
39273930
39283931 ZigLLVM_FnInline fn_inline;
......@@ -3964,7 +3967,8 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
39643967
39653968 for (size_t arg_i = 0; arg_i < gen_param_values.length; arg_i += 1) {
39663969 LLVMValueRef arg_ptr = LLVMBuildStructGEP(g->builder, casted_frame, arg_start_i + arg_i, "");
3967 LLVMBuildStore(g->builder, gen_param_values.at(arg_i), arg_ptr);
3970 gen_assign_raw(g, arg_ptr, get_pointer_to_type(g, gen_param_types.at(arg_i), true),
3971 gen_param_values.at(arg_i));
39683972 }
39693973 }
39703974 if (instruction->is_async) {
test/stage1/behavior/coroutines.zig+21
......@@ -568,3 +568,24 @@ test "errdefers in scope get run when canceling async fn call" {
568568 };
569569 S.doTheTest();
570570}
571
572test "pass string literal to async function" {
573 const S = struct {
574 var frame: anyframe = undefined;
575 var ok: bool = false;
576
577 fn doTheTest() void {
578 _ = async hello("hello");
579 resume frame;
580 expect(ok);
581 }
582
583 fn hello(msg: []const u8) void {
584 frame = @frame();
585 suspend;
586 expectEqual(([]const u8)("hello"), msg);
587 ok = true;
588 }
589 };
590 S.doTheTest();
591}