ms-x86-vfvb-alignment.cpp revision 7967c95891c5f65f6312fbbcb999ac257d776914
1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \ 2// RUN: | FileCheck %s 3// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \ 4// RUN: | FileCheck %s -check-prefix CHECK-X64 5 6extern "C" int printf(const char *fmt, ...); 7 8struct B0 { int a; B0() : a(0xf00000B0) {} }; 9struct B1 { char a; B1() : a(0xB1) {} }; 10struct B2 : virtual B1 { int a; B2() : a(0xf00000B2) {} }; 11struct B3 { __declspec(align(16)) int a; B3() : a(0xf00000B3) {} }; 12struct B4 : virtual B3 { int a; B4() : a(0xf00000B4) {} }; 13struct B5 { __declspec(align(32)) int a; B5() : a(0xf00000B5) {} }; 14struct B6 { int a; B6() : a(0xf00000B6) {} virtual void f() { printf("B6"); } }; 15 16struct A : B0, virtual B1 { __declspec(align(16)) int a; A() : a(0xf000000A) {} virtual void f() { printf("A"); } }; 17 18// CHECK: *** Dumping AST Record Layout 19// CHECK: 0 | struct A 20// CHECK: 0 | (A vftable pointer) 21// CHECK: 16 | struct B0 (base) 22// CHECK: 16 | int a 23// CHECK: 20 | (A vbtable pointer) 24// CHECK: 48 | int a 25// CHECK: 64 | struct B1 (virtual base) 26// CHECK: 64 | char a 27// CHECK: | [sizeof=80, align=16 28// CHECK: | nvsize=64, nvalign=16] 29// CHECK-X64: *** Dumping AST Record Layout 30// CHECK-X64: 0 | struct A 31// CHECK-X64: 0 | (A vftable pointer) 32// CHECK-X64: 8 | struct B0 (base) 33// CHECK-X64: 8 | int a 34// CHECK-X64: 16 | (A vbtable pointer) 35// CHECK-X64: 32 | int a 36// CHECK-X64: 48 | struct B1 (virtual base) 37// CHECK-X64: 48 | char a 38// CHECK-X64: | [sizeof=64, align=16 39// CHECK-X64: | nvsize=48, nvalign=16] 40 41struct B : A, B2 { int a; B() : a(0xf000000B) {} virtual void f() { printf("B"); } }; 42 43// CHECK: *** Dumping AST Record Layout 44// CHECK: 0 | struct B 45// CHECK: 0 | struct A (primary base) 46// CHECK: 0 | (A vftable pointer) 47// CHECK: 16 | struct B0 (base) 48// CHECK: 16 | int a 49// CHECK: 20 | (A vbtable pointer) 50// CHECK: 48 | int a 51// CHECK: 64 | struct B2 (base) 52// CHECK: 64 | (B2 vbtable pointer) 53// CHECK: 68 | int a 54// CHECK: 72 | int a 55// CHECK: 80 | struct B1 (virtual base) 56// CHECK: 80 | char a 57// CHECK: | [sizeof=96, align=16 58// CHECK: | nvsize=80, nvalign=16] 59// CHECK-X64: *** Dumping AST Record Layout 60// CHECK-X64: 0 | struct B 61// CHECK-X64: 0 | struct A (primary base) 62// CHECK-X64: 0 | (A vftable pointer) 63// CHECK-X64: 8 | struct B0 (base) 64// CHECK-X64: 8 | int a 65// CHECK-X64: 16 | (A vbtable pointer) 66// CHECK-X64: 32 | int a 67// CHECK-X64: 48 | struct B2 (base) 68// CHECK-X64: 48 | (B2 vbtable pointer) 69// CHECK-X64: 56 | int a 70// CHECK-X64: 64 | int a 71// CHECK-X64: 80 | struct B1 (virtual base) 72// CHECK-X64: 80 | char a 73// CHECK-X64: | [sizeof=96, align=16 74// CHECK-X64: | nvsize=80, nvalign=16] 75 76struct C : B4 { int a; C() : a(0xf000000C) {} virtual void f() { printf("C"); } }; 77 78// CHECK: *** Dumping AST Record Layout 79// CHECK: 0 | struct C 80// CHECK: 0 | (C vftable pointer) 81// CHECK: 16 | struct B4 (base) 82// CHECK: 16 | (B4 vbtable pointer) 83// CHECK: 20 | int a 84// CHECK: 24 | int a 85// CHECK: 32 | struct B3 (virtual base) 86// CHECK: 32 | int a 87// CHECK: | [sizeof=48, align=16 88// CHECK: | nvsize=32, nvalign=16] 89// CHECK-X64: *** Dumping AST Record Layout 90// CHECK-X64: 0 | struct C 91// CHECK-X64: 0 | (C vftable pointer) 92// CHECK-X64: 16 | struct B4 (base) 93// CHECK-X64: 16 | (B4 vbtable pointer) 94// CHECK-X64: 24 | int a 95// CHECK-X64: 32 | int a 96// CHECK-X64: 48 | struct B3 (virtual base) 97// CHECK-X64: 48 | int a 98// CHECK-X64: | [sizeof=64, align=16 99// CHECK-X64: | nvsize=48, nvalign=16] 100 101struct D : C { int a; D() : a(0xf000000D) {} virtual void f() { printf("D"); } }; 102 103// CHECK: *** Dumping AST Record Layout 104// CHECK: 0 | struct D 105// CHECK: 0 | struct C (primary base) 106// CHECK: 0 | (C vftable pointer) 107// CHECK: 16 | struct B4 (base) 108// CHECK: 16 | (B4 vbtable pointer) 109// CHECK: 20 | int a 110// CHECK: 24 | int a 111// CHECK: 32 | int a 112// CHECK: 48 | struct B3 (virtual base) 113// CHECK: 48 | int a 114// CHECK: | [sizeof=64, align=16 115// CHECK: | nvsize=48, nvalign=16] 116// CHECK-X64: *** Dumping AST Record Layout 117// CHECK-X64: 0 | struct D 118// CHECK-X64: 0 | struct C (primary base) 119// CHECK-X64: 0 | (C vftable pointer) 120// CHECK-X64: 16 | struct B4 (base) 121// CHECK-X64: 16 | (B4 vbtable pointer) 122// CHECK-X64: 24 | int a 123// CHECK-X64: 32 | int a 124// CHECK-X64: 48 | int a 125// CHECK-X64: 64 | struct B3 (virtual base) 126// CHECK-X64: 64 | int a 127// CHECK-X64: | [sizeof=80, align=16 128// CHECK-X64: | nvsize=64, nvalign=16] 129 130struct E : virtual C { int a; E() : a(0xf000000E) {} virtual void f() { printf("E"); } }; 131 132// CHECK: *** Dumping AST Record Layout 133// CHECK: 0 | struct E 134// CHECK: 0 | (E vbtable pointer) 135// CHECK: 4 | int a 136// CHECK: 16 | struct B3 (virtual base) 137// CHECK: 16 | int a 138// CHECK: 44 | (vtordisp for vbase C) 139// CHECK: 48 | struct C (virtual base) 140// CHECK: 48 | (C vftable pointer) 141// CHECK: 64 | struct B4 (base) 142// CHECK: 64 | (B4 vbtable pointer) 143// CHECK: 68 | int a 144// CHECK: 72 | int a 145// CHECK: | [sizeof=80, align=16 146// CHECK: | nvsize=8, nvalign=4] 147// CHECK-X64: *** Dumping AST Record Layout 148// CHECK-X64: 0 | struct E 149// CHECK-X64: 0 | (E vbtable pointer) 150// CHECK-X64: 8 | int a 151// CHECK-X64: 16 | struct B3 (virtual base) 152// CHECK-X64: 16 | int a 153// CHECK-X64: 44 | (vtordisp for vbase C) 154// CHECK-X64: 48 | struct C (virtual base) 155// CHECK-X64: 48 | (C vftable pointer) 156// CHECK-X64: 64 | struct B4 (base) 157// CHECK-X64: 64 | (B4 vbtable pointer) 158// CHECK-X64: 72 | int a 159// CHECK-X64: 80 | int a 160// CHECK-X64: | [sizeof=96, align=16 161// CHECK-X64: | nvsize=16, nvalign=8] 162 163struct F : B3, virtual B0 { int a; F() : a(0xf000000F) {} virtual void f() { printf("F"); } }; 164 165// CHECK: *** Dumping AST Record Layout 166// CHECK: 0 | struct F 167// CHECK: 0 | (F vftable pointer) 168// CHECK: 16 | struct B3 (base) 169// CHECK: 16 | int a 170// CHECK: 32 | (F vbtable pointer) 171// CHECK: 48 | int a 172// CHECK: 64 | struct B0 (virtual base) 173// CHECK: 64 | int a 174// CHECK: | [sizeof=80, align=16 175// CHECK: | nvsize=64, nvalign=16] 176// CHECK-X64: *** Dumping AST Record Layout 177// CHECK-X64: 0 | struct F 178// CHECK-X64: 0 | (F vftable pointer) 179// CHECK-X64: 16 | struct B3 (base) 180// CHECK-X64: 16 | int a 181// CHECK-X64: 32 | (F vbtable pointer) 182// CHECK-X64: 40 | int a 183// CHECK-X64: 48 | struct B0 (virtual base) 184// CHECK-X64: 48 | int a 185// CHECK-X64: | [sizeof=64, align=16 186// CHECK-X64: | nvsize=48, nvalign=16] 187 188struct G : B2, B6, virtual B1 { int a; G() : a(0xf0000010) {} }; 189 190// CHECK: *** Dumping AST Record Layout 191// CHECK: 0 | struct G 192// CHECK: 8 | struct B2 (base) 193// CHECK: 8 | (B2 vbtable pointer) 194// CHECK: 12 | int a 195// CHECK: 0 | struct B6 (primary base) 196// CHECK: 0 | (B6 vftable pointer) 197// CHECK: 4 | int a 198// CHECK: 16 | int a 199// CHECK: 20 | struct B1 (virtual base) 200// CHECK: 20 | char a 201// CHECK: | [sizeof=21, align=4 202// CHECK: | nvsize=20, nvalign=4] 203// CHECK-X64: *** Dumping AST Record Layout 204// CHECK-X64: 0 | struct G 205// CHECK-X64: 16 | struct B2 (base) 206// CHECK-X64: 16 | (B2 vbtable pointer) 207// CHECK-X64: 24 | int a 208// CHECK-X64: 0 | struct B6 (primary base) 209// CHECK-X64: 0 | (B6 vftable pointer) 210// CHECK-X64: 8 | int a 211// CHECK-X64: 32 | int a 212// CHECK-X64: 40 | struct B1 (virtual base) 213// CHECK-X64: 40 | char a 214// CHECK-X64: | [sizeof=48, align=8 215// CHECK-X64: | nvsize=40, nvalign=8] 216 217struct H : B6, B2, virtual B1 { int a; H() : a(0xf0000011) {} }; 218 219// CHECK: *** Dumping AST Record Layout 220// CHECK: 0 | struct H 221// CHECK: 0 | struct B6 (primary base) 222// CHECK: 0 | (B6 vftable pointer) 223// CHECK: 4 | int a 224// CHECK: 8 | struct B2 (base) 225// CHECK: 8 | (B2 vbtable pointer) 226// CHECK: 12 | int a 227// CHECK: 16 | int a 228// CHECK: 20 | struct B1 (virtual base) 229// CHECK: 20 | char a 230// CHECK: | [sizeof=21, align=4 231// CHECK: | nvsize=20, nvalign=4] 232// CHECK-X64: *** Dumping AST Record Layout 233// CHECK-X64: 0 | struct H 234// CHECK-X64: 0 | struct B6 (primary base) 235// CHECK-X64: 0 | (B6 vftable pointer) 236// CHECK-X64: 8 | int a 237// CHECK-X64: 16 | struct B2 (base) 238// CHECK-X64: 16 | (B2 vbtable pointer) 239// CHECK-X64: 24 | int a 240// CHECK-X64: 32 | int a 241// CHECK-X64: 40 | struct B1 (virtual base) 242// CHECK-X64: 40 | char a 243// CHECK-X64: | [sizeof=48, align=8 244// CHECK-X64: | nvsize=40, nvalign=8] 245 246struct I : B0, virtual B1 { int a; int a1; __declspec(align(16)) int a2; I() : a(0xf0000011), a1(0xf0000011), a2(0xf0000011) {} }; 247 248// CHECK: *** Dumping AST Record Layout 249// CHECK: 0 | struct I 250// CHECK: 0 | struct B0 (base) 251// CHECK: 0 | int a 252// CHECK: 4 | (I vbtable pointer) 253// CHECK: 20 | int a 254// CHECK: 24 | int a1 255// CHECK: 32 | int a2 256// CHECK: 48 | struct B1 (virtual base) 257// CHECK: 48 | char a 258// CHECK: | [sizeof=64, align=16 259// CHECK: | nvsize=48, nvalign=16] 260// CHECK-X64: *** Dumping AST Record Layout 261// CHECK-X64: 0 | struct I 262// CHECK-X64: 0 | struct B0 (base) 263// CHECK-X64: 0 | int a 264// CHECK-X64: 8 | (I vbtable pointer) 265// CHECK-X64: 16 | int a 266// CHECK-X64: 20 | int a1 267// CHECK-X64: 32 | int a2 268// CHECK-X64: 48 | struct B1 (virtual base) 269// CHECK-X64: 48 | char a 270// CHECK-X64: | [sizeof=64, align=16 271// CHECK-X64: | nvsize=48, nvalign=16] 272 273struct J : B0, B3, virtual B1 { int a; int a1; J() : a(0xf0000012), a1(0xf0000012) {} }; 274 275// CHECK: *** Dumping AST Record Layout 276// CHECK: 0 | struct J 277// CHECK: 0 | struct B0 (base) 278// CHECK: 0 | int a 279// CHECK: 16 | struct B3 (base) 280// CHECK: 16 | int a 281// CHECK: 32 | (J vbtable pointer) 282// CHECK: 48 | int a 283// CHECK: 52 | int a1 284// CHECK: 64 | struct B1 (virtual base) 285// CHECK: 64 | char a 286// CHECK: | [sizeof=80, align=16 287// CHECK: | nvsize=64, nvalign=16] 288// CHECK-X64: *** Dumping AST Record Layout 289// CHECK-X64: 0 | struct J 290// CHECK-X64: 0 | struct B0 (base) 291// CHECK-X64: 0 | int a 292// CHECK-X64: 16 | struct B3 (base) 293// CHECK-X64: 16 | int a 294// CHECK-X64: 32 | (J vbtable pointer) 295// CHECK-X64: 40 | int a 296// CHECK-X64: 44 | int a1 297// CHECK-X64: 48 | struct B1 (virtual base) 298// CHECK-X64: 48 | char a 299// CHECK-X64: | [sizeof=64, align=16 300// CHECK-X64: | nvsize=48, nvalign=16] 301 302struct K { int a; K() : a(0xf0000013) {} virtual void f() { printf("K"); } }; 303 304// CHECK: *** Dumping AST Record Layout 305// CHECK: 0 | struct K 306// CHECK: 0 | (K vftable pointer) 307// CHECK: 4 | int a 308// CHECK: | [sizeof=8, align=4 309// CHECK: | nvsize=8, nvalign=4] 310// CHECK-X64: *** Dumping AST Record Layout 311// CHECK-X64: 0 | struct K 312// CHECK-X64: 0 | (K vftable pointer) 313// CHECK-X64: 8 | int a 314// CHECK-X64: | [sizeof=16, align=8 315// CHECK-X64: | nvsize=16, nvalign=8] 316 317struct L : virtual K { int a; L() : a(0xf0000014) {} virtual void g() { printf("L"); } }; 318 319// CHECK: *** Dumping AST Record Layout 320// CHECK: 0 | struct L 321// CHECK: 0 | (L vftable pointer) 322// CHECK: 4 | (L vbtable pointer) 323// CHECK: 8 | int a 324// CHECK: 12 | struct K (virtual base) 325// CHECK: 12 | (K vftable pointer) 326// CHECK: 16 | int a 327// CHECK: | [sizeof=20, align=4 328// CHECK: | nvsize=12, nvalign=4] 329// CHECK-X64: *** Dumping AST Record Layout 330// CHECK-X64: 0 | struct L 331// CHECK-X64: 0 | (L vftable pointer) 332// CHECK-X64: 8 | (L vbtable pointer) 333// CHECK-X64: 16 | int a 334// CHECK-X64: 24 | struct K (virtual base) 335// CHECK-X64: 24 | (K vftable pointer) 336// CHECK-X64: 32 | int a 337// CHECK-X64: | [sizeof=40, align=8 338// CHECK-X64: | nvsize=24, nvalign=8] 339 340struct M : virtual K { int a; M() : a(0xf0000015) {} virtual void f() { printf("M"); } }; 341 342// CHECK: *** Dumping AST Record Layout 343// CHECK: 0 | struct M 344// CHECK: 0 | (M vbtable pointer) 345// CHECK: 4 | int a 346// CHECK: 8 | (vtordisp for vbase K) 347// CHECK: 12 | struct K (virtual base) 348// CHECK: 12 | (K vftable pointer) 349// CHECK: 16 | int a 350// CHECK: | [sizeof=20, align=4 351// CHECK: | nvsize=8, nvalign=4] 352// CHECK-X64: *** Dumping AST Record Layout 353// CHECK-X64: 0 | struct M 354// CHECK-X64: 0 | (M vbtable pointer) 355// CHECK-X64: 8 | int a 356// CHECK-X64: 20 | (vtordisp for vbase K) 357// CHECK-X64: 24 | struct K (virtual base) 358// CHECK-X64: 24 | (K vftable pointer) 359// CHECK-X64: 32 | int a 360// CHECK-X64: | [sizeof=40, align=8 361// CHECK-X64: | nvsize=16, nvalign=8] 362 363int a[ 364sizeof(A)+ 365sizeof(B)+ 366sizeof(C)+ 367sizeof(D)+ 368sizeof(E)+ 369sizeof(F)+ 370sizeof(G)+ 371sizeof(H)+ 372sizeof(I)+ 373sizeof(J)+ 374sizeof(K)+ 375sizeof(L)+ 376sizeof(M)]; 377