Commit 67bd0267db

LemonBoy <thatlemon@gmail.com>
2019-09-10 21:05:41
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
1 parent 70e934f
Changed files (2)
src
test
stage1
behavior
src/analyze.cpp
@@ -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;
test/stage1/behavior/struct.zig
@@ -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);
+}