| author | |
| committer | |
| log | ed3181f029809f8cd608f2c20b60d1b7c6e353e3 |
| tree | f0a9143d8c6a682e974768f0b095a159e8db9415 |
| parent | 2a719ee6c598b7096060168a0e7c93ae3e244008 |
| parent | f78d4ed30c1bd92fc5ecc26c2d5f11751b406255 |
3 files changed, 19 insertions(+), 0 deletions(-)
src/codegen.cpp+4| ... | ... | @@ -3166,6 +3166,10 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr |
| 3166 | 3166 | return nullptr; |
| 3167 | 3167 | } else if (first_arg_ret) { |
| 3168 | 3168 | return instruction->tmp_ptr; |
| 3169 | } else if (handle_is_ptr(src_return_type)) { | |
| 3170 | auto store_instr = LLVMBuildStore(g->builder, result, instruction->tmp_ptr); | |
| 3171 | LLVMSetAlignment(store_instr, LLVMGetAlignment(instruction->tmp_ptr)); | |
| 3172 | return instruction->tmp_ptr; | |
| 3169 | 3173 | } else { |
| 3170 | 3174 | return result; |
| 3171 | 3175 | } |
test/behavior.zig+1| ... | ... | @@ -9,6 +9,7 @@ comptime { |
| 9 | 9 | _ = @import("cases/bitcast.zig"); |
| 10 | 10 | _ = @import("cases/bool.zig"); |
| 11 | 11 | _ = @import("cases/bugs/1111.zig"); |
| 12 | _ = @import("cases/bugs/1230.zig"); | |
| 12 | 13 | _ = @import("cases/bugs/394.zig"); |
| 13 | 14 | _ = @import("cases/bugs/655.zig"); |
| 14 | 15 | _ = @import("cases/bugs/656.zig"); |
test/cases/bugs/1230.zig created+14| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | const assert = @import("std").debug.assert; | |
| 2 | ||
| 3 | const S = extern struct { | |
| 4 | x: i32, | |
| 5 | }; | |
| 6 | ||
| 7 | extern fn ret_struct() S { | |
| 8 | return S{ .x = 42 }; | |
| 9 | } | |
| 10 | ||
| 11 | test "extern return small struct (bug 1230)" { | |
| 12 | const s = ret_struct(); | |
| 13 | assert(s.x == 42); | |
| 14 | } |