mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 19:06:05 +00:00

Summary: This patch fixes several small problems with external layouts support in `MicrosoftRecordLayoutBuilder`: - aligns properly the size of a struct that ends with a bit field. It was aligned on byte before, not on the size of the field, so the struct size was smaller than it should be; - adjusts the struct size when injecting a vbptr in the case when there were no bases or fields allocated after the vbptr. Similarly, without the adjustment the struct was smaller than it should be; - the same fix as above for the vfptr. All these fixes affect the non-virtual size of a struct, so they are tested through non-virtual inheritance. Reviewers: rnk, zturner, rsmith Reviewed By: rnk Subscribers: jdoerfert, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D58544 llvm-svn: 356047
37 lines
722 B
C++
37 lines
722 B
C++
// RUN: %clang_cc1 -w -triple=x86_64-pc-win32 -fms-compatibility -fdump-record-layouts-simple -foverride-record-layout=%S/Inputs/override-bit-field-layout.layout %s | FileCheck %s
|
|
|
|
// CHECK: Type: struct S1
|
|
// CHECK: FieldOffsets: [0, 11]
|
|
struct S1 {
|
|
short a : 3;
|
|
short b : 5;
|
|
};
|
|
|
|
// CHECK: Type: struct S2
|
|
// CHECK: FieldOffsets: [64]
|
|
struct S2 {
|
|
virtual ~S2() = default;
|
|
short a : 3;
|
|
};
|
|
|
|
// CHECK: Type: struct S3
|
|
// CHECK: Size:32
|
|
// CHECK: FieldOffsets: [0, 1]
|
|
struct S3 {
|
|
int a : 1;
|
|
int b : 2;
|
|
};
|
|
|
|
// CHECK: Type: struct S4
|
|
// CHECK: FieldOffsets: [32]
|
|
struct S4 : S3 {
|
|
char c;
|
|
};
|
|
|
|
void use_structs() {
|
|
S1 s1s[sizeof(S1)];
|
|
S2 s2s[sizeof(S2)];
|
|
S3 s3s[sizeof(S3)];
|
|
S4 s4s[sizeof(S4)];
|
|
}
|