Correct calculation of padding length in struct

Make sure the resulting type is in-sync with the one produced and used
by LLVM.

Fixes #3138
This commit is contained in:
LemonBoy 2019-09-10 21:05:41 +02:00 committed by Andrew Kelley
parent 70e934f116
commit 67bd0267db
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 20 additions and 1 deletions

View File

@ -7839,7 +7839,7 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS
assert(next_offset >= llvm_next_offset);
if (next_offset > llvm_next_offset) {
size_t pad_bytes = next_offset - (field->offset + field_type->abi_size);
size_t pad_bytes = next_offset - llvm_next_offset;
if (pad_bytes != 0) {
LLVMTypeRef pad_llvm_type = LLVMArrayType(LLVMInt8Type(), pad_bytes);
element_types[gen_field_index] = pad_llvm_type;

View File

@ -670,3 +670,22 @@ test "packed struct with non-ABI-aligned field" {
expect(s.x == 1);
expect(s.y == 42);
}
test "non-packed struct with u128 entry in union" {
const U = union(enum) {
Num: u128,
Void,
};
const S = struct {
f1: U,
f2: U,
};
var sx: S = undefined;
var s = &sx;
std.testing.expect(@ptrToInt(&s.f2) - @ptrToInt(&s.f1) == @byteOffsetOf(S, "f2"));
var v2 = U{ .Num = 123 };
s.f2 = v2;
std.testing.expect(s.f2.Num == 123);
}