mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
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:
parent
70e934f116
commit
67bd0267db
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user