ms_class_layout.cpp revision 2fe363622c32c471e8a68c68ba5cc372644f24fb
1// RUN: %clang_cc1 -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -cxx-abi microsoft %s 2>&1 \ 2// RUN: | FileCheck %s 3 4#pragma pack(push, 8) 5 6class B { 7public: 8 virtual void b(){} 9 int b_field; 10protected: 11private: 12}; 13 14class A : public B { 15public: 16 int a_field; 17 virtual void a(){} 18 char one; 19protected: 20private: 21}; 22 23class D { 24public: 25 virtual void b(){} 26 double a; 27}; 28 29class C : public virtual A, 30 public D, public B { 31public: 32 double c1_field; 33 int c2_field; 34 double c3_field; 35 int c4_field; 36 virtual void foo(){} 37 virtual void bar(){} 38protected: 39private: 40}; 41 42struct BaseStruct 43{ 44 BaseStruct(){} 45 double v0; 46 float v1; 47 C fg; 48}; 49 50struct DerivedStruct : public BaseStruct { 51 int x; 52}; 53 54struct G 55{ 56 virtual ~G(){} 57 int a; 58 double b; 59}; 60 61#pragma pack(pop) 62 63// This needs only for building layouts. 64// Without this clang doesn`t dump record layouts. 65int main() { 66 // This avoid "Can't yet mangle constructors!" for MS ABI. 67 C* c; 68 c->foo(); 69 DerivedStruct* v; 70 G* g; 71 BaseStruct* u; 72 return 0; 73} 74 75// CHECK: 0 | class D 76// CHECK-NEXT: 0 | (D vtable pointer) 77// CHECK-NEXT: 8 | double a 78 79// CHECK-NEXT: sizeof=16, dsize=16, align=8 80// CHECK-NEXT: nvsize=16, nvalign=8 81 82// CHECK: 0 | class B 83// CHECK-NEXT: 0 | (B vtable pointer) 84// CHECK-NEXT: 4 | int b_field 85 86// CHECK-NEXT: sizeof=8, dsize=8, align=4 87// CHECK-NEXT: nvsize=8, nvalign=4 88 89// CHECK: 0 | class A 90// CHECK-NEXT: 0 | class B (primary base) 91// CHECK-NEXT: 0 | (B vtable pointer) 92// CHECK-NEXT: 4 | int b_field 93// CHECK-NEXT: 8 | int a_field 94// CHECK-NEXT: 12 | char one 95 96// CHECK-NEXT: sizeof=16, dsize=16, align=4 97// CHECK-NEXT: nvsize=16, nvalign=4 98 99// CHECK: 0 | class C 100// CHECK-NEXT: 0 | class D (primary base) 101// CHECK-NEXT: 0 | (D vtable pointer) 102// CHECK-NEXT: 8 | double a 103// CHECK-NEXT: 16 | class B (base) 104// CHECK-NEXT: 16 | (B vtable pointer) 105// CHECK-NEXT: 20 | int b_field 106// CHECK-NEXT: 24 | (C vbtable pointer) 107// CHECK-NEXT: 32 | double c1_field 108// CHECK-NEXT: 40 | int c2_field 109// CHECK-NEXT: 48 | double c3_field 110// CHECK-NEXT: 56 | int c4_field 111// CHECK-NEXT: 64 | class A (virtual base) 112// CHECK-NEXT: 64 | class B (primary base) 113// CHECK-NEXT: 64 | (B vtable pointer) 114// CHECK-NEXT: 68 | int b_field 115// CHECK-NEXT: 72 | int a_field 116// CHECK-NEXT: 76 | char one 117 118// CHECK-NEXT: sizeof=80, dsize=80, align=8 119// CHECK-NEXT: nvsize=80, nvalign=8 120 121// CHECK: 0 | struct BaseStruct 122// CHECK-NEXT: 0 | double v0 123// CHECK-NEXT: 8 | float v1 124// CHECK-NEXT: 16 | class C fg 125// CHECK-NEXT: 16 | class D (primary base) 126// CHECK-NEXT: 16 | (D vtable pointer) 127// CHECK-NEXT: 24 | double a 128// CHECK-NEXT: 32 | class B (base) 129// CHECK-NEXT: 32 | (B vtable pointer) 130// CHECK-NEXT: 36 | int b_field 131// CHECK-NEXT: 40 | (C vbtable pointer) 132// CHECK-NEXT: 48 | double c1_field 133// CHECK-NEXT: 56 | int c2_field 134// CHECK-NEXT: 64 | double c3_field 135// CHECK-NEXT: 72 | int c4_field 136// CHECK-NEXT: 80 | class A (virtual base) 137// CHECK-NEXT: 80 | class B (primary base) 138// CHECK-NEXT: 80 | (B vtable pointer) 139// CHECK-NEXT: 84 | int b_field 140// CHECK-NEXT: 88 | int a_field 141// CHECK-NEXT: 92 | char one 142 143// CHECK-NEXT: sizeof=80, dsize=80, align=8 144// CHECK-NEXT: nvsize=80, nvalign=8 145 146// CHECK: sizeof=96, dsize=96, align=8 147// CHECK-NEXT: nvsize=96, nvalign=8 148 149// CHECK: 0 | struct DerivedStruct 150// CHECK-NEXT: 0 | struct BaseStruct (base) 151// CHECK-NEXT: 0 | double v0 152// CHECK-NEXT: 8 | float v1 153// CHECK-NEXT: 16 | class C fg 154// CHECK-NEXT: 16 | class D (primary base) 155// CHECK-NEXT: 16 | (D vtable pointer) 156// CHECK-NEXT: 24 | double a 157// CHECK-NEXT: 32 | class B (base) 158// CHECK-NEXT: 32 | (B vtable pointer) 159// CHECK-NEXT: 36 | int b_field 160// CHECK-NEXT: 40 | (C vbtable pointer) 161// CHECK-NEXT: 48 | double c1_field 162// CHECK-NEXT: 56 | int c2_field 163// CHECK-NEXT: 64 | double c3_field 164// CHECK-NEXT: 72 | int c4_field 165// CHECK-NEXT: 80 | class A (virtual base) 166// CHECK-NEXT: 80 | class B (primary base) 167// CHECK-NEXT: 80 | (B vtable pointer) 168// CHECK-NEXT: 84 | int b_field 169// CHECK-NEXT: 88 | int a_field 170// CHECK-NEXT: 92 | char one 171// CHECK-NEXT: sizeof=80, dsize=80, align=8 172// CHECK-NEXT: nvsize=80, nvalign=8 173 174// CHECK: 96 | int x 175// CHECK-NEXT: sizeof=104, dsize=104, align=8 176// CHECK-NEXT: nvsize=104, nvalign=8 177