1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \ 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 6 extern "C" int printf(const char *fmt, ...); 7 8 struct A4 { 9 int a; 10 A4() : a(0xf00000a4) {} 11 }; 12 13 struct B4 { 14 int a; 15 B4() : a(0xf00000b4) {} 16 }; 17 18 struct C4 { 19 int a; 20 C4() : a(0xf00000c4) {} 21 virtual void f() {printf("C4");} 22 }; 23 24 struct A16 { 25 __declspec(align(16)) int a; 26 A16() : a(0xf0000a16) {} 27 }; 28 29 struct C16 { 30 __declspec(align(16)) int a; 31 C16() : a(0xf0000c16) {} 32 virtual void f() {printf("C16");} 33 }; 34 35 struct TestF0 : A4, virtual B4 { 36 int a; 37 TestF0() : a(0xf00000F0) {} 38 }; 39 40 // CHECK: *** Dumping AST Record Layout 41 // CHECK: 0 | struct TestF0 42 // CHECK: 0 | struct A4 (base) 43 // CHECK: 0 | int a 44 // CHECK: 4 | (TestF0 vbtable pointer) 45 // CHECK: 8 | int a 46 // CHECK: 12 | struct B4 (virtual base) 47 // CHECK: 12 | int a 48 // CHECK: | [sizeof=16, align=4 49 // CHECK: | nvsize=12, nvalign=4] 50 // CHECK-X64: *** Dumping AST Record Layout 51 // CHECK-X64: 0 | struct TestF0 52 // CHECK-X64: 0 | struct A4 (base) 53 // CHECK-X64: 0 | int a 54 // CHECK-X64: 8 | (TestF0 vbtable pointer) 55 // CHECK-X64: 16 | int a 56 // CHECK-X64: 24 | struct B4 (virtual base) 57 // CHECK-X64: 24 | int a 58 // CHECK-X64: | [sizeof=32, align=8 59 // CHECK-X64: | nvsize=24, nvalign=8] 60 61 struct TestF1 : A4, virtual A16 { 62 int a; 63 TestF1() : a(0xf00000f1) {} 64 }; 65 66 // CHECK: *** Dumping AST Record Layout 67 // CHECK: 0 | struct TestF1 68 // CHECK: 0 | struct A4 (base) 69 // CHECK: 0 | int a 70 // CHECK: 4 | (TestF1 vbtable pointer) 71 // CHECK: 8 | int a 72 // CHECK: 16 | struct A16 (virtual base) 73 // CHECK: 16 | int a 74 // CHECK: | [sizeof=32, align=16 75 // CHECK: | nvsize=12, nvalign=4] 76 // CHECK-X64: *** Dumping AST Record Layout 77 // CHECK-X64: 0 | struct TestF1 78 // CHECK-X64: 0 | struct A4 (base) 79 // CHECK-X64: 0 | int a 80 // CHECK-X64: 8 | (TestF1 vbtable pointer) 81 // CHECK-X64: 16 | int a 82 // CHECK-X64: 32 | struct A16 (virtual base) 83 // CHECK-X64: 32 | int a 84 // CHECK-X64: | [sizeof=48, align=16 85 // CHECK-X64: | nvsize=24, nvalign=8] 86 87 struct TestF2 : A4, virtual C4 { 88 int a; 89 TestF2() : a(0xf00000f2) {} 90 }; 91 92 // CHECK: *** Dumping AST Record Layout 93 // CHECK: 0 | struct TestF2 94 // CHECK: 0 | struct A4 (base) 95 // CHECK: 0 | int a 96 // CHECK: 4 | (TestF2 vbtable pointer) 97 // CHECK: 8 | int a 98 // CHECK: 12 | struct C4 (virtual base) 99 // CHECK: 12 | (C4 vftable pointer) 100 // CHECK: 16 | int a 101 // CHECK: | [sizeof=20, align=4 102 // CHECK: | nvsize=12, nvalign=4] 103 // CHECK-X64: *** Dumping AST Record Layout 104 // CHECK-X64: 0 | struct TestF2 105 // CHECK-X64: 0 | struct A4 (base) 106 // CHECK-X64: 0 | int a 107 // CHECK-X64: 8 | (TestF2 vbtable pointer) 108 // CHECK-X64: 16 | int a 109 // CHECK-X64: 24 | struct C4 (virtual base) 110 // CHECK-X64: 24 | (C4 vftable pointer) 111 // CHECK-X64: 32 | int a 112 // CHECK-X64: | [sizeof=40, align=8 113 // CHECK-X64: | nvsize=24, nvalign=8] 114 115 struct TestF3 : A4, virtual C16 { 116 int a; 117 TestF3() : a(0xf00000f3) {} 118 }; 119 120 // CHECK: *** Dumping AST Record Layout 121 // CHECK: 0 | struct TestF3 122 // CHECK: 0 | struct A4 (base) 123 // CHECK: 0 | int a 124 // CHECK: 4 | (TestF3 vbtable pointer) 125 // CHECK: 8 | int a 126 // CHECK: 16 | struct C16 (virtual base) 127 // CHECK: 16 | (C16 vftable pointer) 128 // CHECK: 32 | int a 129 // CHECK: | [sizeof=48, align=16 130 // CHECK: | nvsize=12, nvalign=4] 131 // CHECK-X64: *** Dumping AST Record Layout 132 // CHECK-X64: 0 | struct TestF3 133 // CHECK-X64: 0 | struct A4 (base) 134 // CHECK-X64: 0 | int a 135 // CHECK-X64: 8 | (TestF3 vbtable pointer) 136 // CHECK-X64: 16 | int a 137 // CHECK-X64: 32 | struct C16 (virtual base) 138 // CHECK-X64: 32 | (C16 vftable pointer) 139 // CHECK-X64: 48 | int a 140 // CHECK-X64: | [sizeof=64, align=16 141 // CHECK-X64: | nvsize=24, nvalign=8] 142 143 struct TestF4 : TestF3, A4 { 144 int a; 145 TestF4() : a(0xf00000f4) {} 146 }; 147 148 // CHECK: *** Dumping AST Record Layout 149 // CHECK: 0 | struct TestF4 150 // CHECK: 0 | struct TestF3 (base) 151 // CHECK: 0 | struct A4 (base) 152 // CHECK: 0 | int a 153 // CHECK: 4 | (TestF3 vbtable pointer) 154 // CHECK: 8 | int a 155 // CHECK: 12 | struct A4 (base) 156 // CHECK: 12 | int a 157 // CHECK: 16 | int a 158 // CHECK: 32 | struct C16 (virtual base) 159 // CHECK: 32 | (C16 vftable pointer) 160 // CHECK: 48 | int a 161 // CHECK: | [sizeof=64, align=16 162 // CHECK: | nvsize=32, nvalign=16] 163 // CHECK-X64: *** Dumping AST Record Layout 164 // CHECK-X64: 0 | struct TestF4 165 // CHECK-X64: 0 | struct TestF3 (base) 166 // CHECK-X64: 0 | struct A4 (base) 167 // CHECK-X64: 0 | int a 168 // CHECK-X64: 8 | (TestF3 vbtable pointer) 169 // CHECK-X64: 16 | int a 170 // CHECK-X64: 24 | struct A4 (base) 171 // CHECK-X64: 24 | int a 172 // CHECK-X64: 28 | int a 173 // CHECK-X64: 32 | struct C16 (virtual base) 174 // CHECK-X64: 32 | (C16 vftable pointer) 175 // CHECK-X64: 48 | int a 176 // CHECK-X64: | [sizeof=64, align=16 177 // CHECK-X64: | nvsize=32, nvalign=16] 178 179 struct TestF5 : TestF3, A4 { 180 int a; 181 TestF5() : a(0xf00000f5) {} 182 virtual void g() {printf("F5");} 183 }; 184 185 // CHECK: *** Dumping AST Record Layout 186 // CHECK: 0 | struct TestF5 187 // CHECK: 0 | (TestF5 vftable pointer) 188 // CHECK: 16 | struct TestF3 (base) 189 // CHECK: 16 | struct A4 (base) 190 // CHECK: 16 | int a 191 // CHECK: 20 | (TestF3 vbtable pointer) 192 // CHECK: 24 | int a 193 // CHECK: 28 | struct A4 (base) 194 // CHECK: 28 | int a 195 // CHECK: 32 | int a 196 // CHECK: 48 | struct C16 (virtual base) 197 // CHECK: 48 | (C16 vftable pointer) 198 // CHECK: 64 | int a 199 // CHECK: | [sizeof=80, align=16 200 // CHECK: | nvsize=48, nvalign=16] 201 // CHECK-X64: *** Dumping AST Record Layout 202 // CHECK-X64: 0 | struct TestF5 203 // CHECK-X64: 0 | (TestF5 vftable pointer) 204 // CHECK-X64: 16 | struct TestF3 (base) 205 // CHECK-X64: 16 | struct A4 (base) 206 // CHECK-X64: 16 | int a 207 // CHECK-X64: 24 | (TestF3 vbtable pointer) 208 // CHECK-X64: 32 | int a 209 // CHECK-X64: 40 | struct A4 (base) 210 // CHECK-X64: 40 | int a 211 // CHECK-X64: 44 | int a 212 // CHECK-X64: 48 | struct C16 (virtual base) 213 // CHECK-X64: 48 | (C16 vftable pointer) 214 // CHECK-X64: 64 | int a 215 // CHECK-X64: | [sizeof=80, align=16 216 // CHECK-X64: | nvsize=48, nvalign=16] 217 218 struct TestF6 : TestF3, A4 { 219 int a; 220 TestF6() : a(0xf00000f6) {} 221 virtual void f() {printf("F6");} 222 }; 223 224 // CHECK: *** Dumping AST Record Layout 225 // CHECK: 0 | struct TestF6 226 // CHECK: 0 | struct TestF3 (base) 227 // CHECK: 0 | struct A4 (base) 228 // CHECK: 0 | int a 229 // CHECK: 4 | (TestF3 vbtable pointer) 230 // CHECK: 8 | int a 231 // CHECK: 12 | struct A4 (base) 232 // CHECK: 12 | int a 233 // CHECK: 16 | int a 234 // CHECK: 44 | (vtordisp for vbase C16) 235 // CHECK: 48 | struct C16 (virtual base) 236 // CHECK: 48 | (C16 vftable pointer) 237 // CHECK: 64 | int a 238 // CHECK: | [sizeof=80, align=16 239 // CHECK: | nvsize=32, nvalign=16] 240 // CHECK-X64: *** Dumping AST Record Layout 241 // CHECK-X64: 0 | struct TestF6 242 // CHECK-X64: 0 | struct TestF3 (base) 243 // CHECK-X64: 0 | struct A4 (base) 244 // CHECK-X64: 0 | int a 245 // CHECK-X64: 8 | (TestF3 vbtable pointer) 246 // CHECK-X64: 16 | int a 247 // CHECK-X64: 24 | struct A4 (base) 248 // CHECK-X64: 24 | int a 249 // CHECK-X64: 28 | int a 250 // CHECK-X64: 44 | (vtordisp for vbase C16) 251 // CHECK-X64: 48 | struct C16 (virtual base) 252 // CHECK-X64: 48 | (C16 vftable pointer) 253 // CHECK-X64: 64 | int a 254 // CHECK-X64: | [sizeof=80, align=16 255 // CHECK-X64: | nvsize=32, nvalign=16] 256 257 struct TestF7 : A4, virtual C16 { 258 int a; 259 TestF7() : a(0xf00000f7) {} 260 virtual void f() {printf("F7");} 261 }; 262 263 // CHECK: *** Dumping AST Record Layout 264 // CHECK: 0 | struct TestF7 265 // CHECK: 0 | struct A4 (base) 266 // CHECK: 0 | int a 267 // CHECK: 4 | (TestF7 vbtable pointer) 268 // CHECK: 8 | int a 269 // CHECK: 28 | (vtordisp for vbase C16) 270 // CHECK: 32 | struct C16 (virtual base) 271 // CHECK: 32 | (C16 vftable pointer) 272 // CHECK: 48 | int a 273 // CHECK: | [sizeof=64, align=16 274 // CHECK: | nvsize=12, nvalign=4] 275 // CHECK-X64: *** Dumping AST Record Layout 276 // CHECK-X64: 0 | struct TestF7 277 // CHECK-X64: 0 | struct A4 (base) 278 // CHECK-X64: 0 | int a 279 // CHECK-X64: 8 | (TestF7 vbtable pointer) 280 // CHECK-X64: 16 | int a 281 // CHECK-X64: 44 | (vtordisp for vbase C16) 282 // CHECK-X64: 48 | struct C16 (virtual base) 283 // CHECK-X64: 48 | (C16 vftable pointer) 284 // CHECK-X64: 64 | int a 285 // CHECK-X64: | [sizeof=80, align=16 286 // CHECK-X64: | nvsize=24, nvalign=8] 287 288 struct TestF8 : TestF7, A4 { 289 int a; 290 TestF8() : a(0xf00000f8) {} 291 virtual void f() {printf("F8");} 292 }; 293 294 // CHECK: *** Dumping AST Record Layout 295 // CHECK: 0 | struct TestF8 296 // CHECK: 0 | struct TestF7 (base) 297 // CHECK: 0 | struct A4 (base) 298 // CHECK: 0 | int a 299 // CHECK: 4 | (TestF7 vbtable pointer) 300 // CHECK: 8 | int a 301 // CHECK: 12 | struct A4 (base) 302 // CHECK: 12 | int a 303 // CHECK: 16 | int a 304 // CHECK: 44 | (vtordisp for vbase C16) 305 // CHECK: 48 | struct C16 (virtual base) 306 // CHECK: 48 | (C16 vftable pointer) 307 // CHECK: 64 | int a 308 // CHECK: | [sizeof=80, align=16 309 // CHECK: | nvsize=32, nvalign=16] 310 // CHECK-X64: *** Dumping AST Record Layout 311 // CHECK-X64: 0 | struct TestF8 312 // CHECK-X64: 0 | struct TestF7 (base) 313 // CHECK-X64: 0 | struct A4 (base) 314 // CHECK-X64: 0 | int a 315 // CHECK-X64: 8 | (TestF7 vbtable pointer) 316 // CHECK-X64: 16 | int a 317 // CHECK-X64: 24 | struct A4 (base) 318 // CHECK-X64: 24 | int a 319 // CHECK-X64: 28 | int a 320 // CHECK-X64: 44 | (vtordisp for vbase C16) 321 // CHECK-X64: 48 | struct C16 (virtual base) 322 // CHECK-X64: 48 | (C16 vftable pointer) 323 // CHECK-X64: 64 | int a 324 // CHECK-X64: | [sizeof=80, align=16 325 // CHECK-X64: | nvsize=32, nvalign=16] 326 327 struct TestF9 : A4, virtual C16 { 328 int a; 329 TestF9() : a(0xf00000f9) {} 330 virtual void g() {printf("F9");} 331 }; 332 333 // CHECK: *** Dumping AST Record Layout 334 // CHECK: 0 | struct TestF9 335 // CHECK: 0 | (TestF9 vftable pointer) 336 // CHECK: 4 | struct A4 (base) 337 // CHECK: 4 | int a 338 // CHECK: 8 | (TestF9 vbtable pointer) 339 // CHECK: 12 | int a 340 // CHECK: 16 | struct C16 (virtual base) 341 // CHECK: 16 | (C16 vftable pointer) 342 // CHECK: 32 | int a 343 // CHECK: | [sizeof=48, align=16 344 // CHECK: | nvsize=16, nvalign=4] 345 // CHECK-X64: *** Dumping AST Record Layout 346 // CHECK-X64: 0 | struct TestF9 347 // CHECK-X64: 0 | (TestF9 vftable pointer) 348 // CHECK-X64: 8 | struct A4 (base) 349 // CHECK-X64: 8 | int a 350 // CHECK-X64: 16 | (TestF9 vbtable pointer) 351 // CHECK-X64: 24 | int a 352 // CHECK-X64: 32 | struct C16 (virtual base) 353 // CHECK-X64: 32 | (C16 vftable pointer) 354 // CHECK-X64: 48 | int a 355 // CHECK-X64: | [sizeof=64, align=16 356 // CHECK-X64: | nvsize=32, nvalign=8] 357 358 struct TestFA : TestF9, A4 { 359 int a; 360 TestFA() : a(0xf00000fa) {} 361 virtual void g() {printf("FA");} 362 }; 363 364 // CHECK: *** Dumping AST Record Layout 365 // CHECK: 0 | struct TestFA 366 // CHECK: 0 | struct TestF9 (primary base) 367 // CHECK: 0 | (TestF9 vftable pointer) 368 // CHECK: 4 | struct A4 (base) 369 // CHECK: 4 | int a 370 // CHECK: 8 | (TestF9 vbtable pointer) 371 // CHECK: 12 | int a 372 // CHECK: 16 | struct A4 (base) 373 // CHECK: 16 | int a 374 // CHECK: 20 | int a 375 // CHECK: 32 | struct C16 (virtual base) 376 // CHECK: 32 | (C16 vftable pointer) 377 // CHECK: 48 | int a 378 // CHECK: | [sizeof=64, align=16 379 // CHECK: | nvsize=32, nvalign=16] 380 // CHECK-X64: *** Dumping AST Record Layout 381 // CHECK-X64: 0 | struct TestFA 382 // CHECK-X64: 0 | struct TestF9 (primary base) 383 // CHECK-X64: 0 | (TestF9 vftable pointer) 384 // CHECK-X64: 8 | struct A4 (base) 385 // CHECK-X64: 8 | int a 386 // CHECK-X64: 16 | (TestF9 vbtable pointer) 387 // CHECK-X64: 24 | int a 388 // CHECK-X64: 32 | struct A4 (base) 389 // CHECK-X64: 32 | int a 390 // CHECK-X64: 36 | int a 391 // CHECK-X64: 48 | struct C16 (virtual base) 392 // CHECK-X64: 48 | (C16 vftable pointer) 393 // CHECK-X64: 64 | int a 394 // CHECK-X64: | [sizeof=80, align=16 395 // CHECK-X64: | nvsize=48, nvalign=16] 396 397 struct TestFB : A16, virtual C16 { 398 int a; 399 TestFB() : a(0xf00000fb) {} 400 virtual void g() {printf("Fb");} 401 }; 402 403 // CHECK: *** Dumping AST Record Layout 404 // CHECK: 0 | struct TestFB 405 // CHECK: 0 | (TestFB vftable pointer) 406 // CHECK: 16 | struct A16 (base) 407 // CHECK: 16 | int a 408 // CHECK: 32 | (TestFB vbtable pointer) 409 // CHECK: 48 | int a 410 // CHECK: 64 | struct C16 (virtual base) 411 // CHECK: 64 | (C16 vftable pointer) 412 // CHECK: 80 | int a 413 // CHECK: | [sizeof=96, align=16 414 // CHECK: | nvsize=64, nvalign=16] 415 // CHECK-X64: *** Dumping AST Record Layout 416 // CHECK-X64: 0 | struct TestFB 417 // CHECK-X64: 0 | (TestFB vftable pointer) 418 // CHECK-X64: 16 | struct A16 (base) 419 // CHECK-X64: 16 | int a 420 // CHECK-X64: 32 | (TestFB vbtable pointer) 421 // CHECK-X64: 40 | int a 422 // CHECK-X64: 48 | struct C16 (virtual base) 423 // CHECK-X64: 48 | (C16 vftable pointer) 424 // CHECK-X64: 64 | int a 425 // CHECK-X64: | [sizeof=80, align=16 426 // CHECK-X64: | nvsize=48, nvalign=16] 427 428 struct TestFC : TestFB, A4 { 429 int a; 430 TestFC() : a(0xf00000fc) {} 431 virtual void g() {printf("FC");} 432 }; 433 434 // CHECK: *** Dumping AST Record Layout 435 // CHECK: 0 | struct TestFC 436 // CHECK: 0 | struct TestFB (primary base) 437 // CHECK: 0 | (TestFB vftable pointer) 438 // CHECK: 16 | struct A16 (base) 439 // CHECK: 16 | int a 440 // CHECK: 32 | (TestFB vbtable pointer) 441 // CHECK: 48 | int a 442 // CHECK: 64 | struct A4 (base) 443 // CHECK: 64 | int a 444 // CHECK: 68 | int a 445 // CHECK: 80 | struct C16 (virtual base) 446 // CHECK: 80 | (C16 vftable pointer) 447 // CHECK: 96 | int a 448 // CHECK: | [sizeof=112, align=16 449 // CHECK: | nvsize=80, nvalign=16] 450 // CHECK-X64: *** Dumping AST Record Layout 451 // CHECK-X64: 0 | struct TestFC 452 // CHECK-X64: 0 | struct TestFB (primary base) 453 // CHECK-X64: 0 | (TestFB vftable pointer) 454 // CHECK-X64: 16 | struct A16 (base) 455 // CHECK-X64: 16 | int a 456 // CHECK-X64: 32 | (TestFB vbtable pointer) 457 // CHECK-X64: 40 | int a 458 // CHECK-X64: 48 | struct A4 (base) 459 // CHECK-X64: 48 | int a 460 // CHECK-X64: 52 | int a 461 // CHECK-X64: 64 | struct C16 (virtual base) 462 // CHECK-X64: 64 | (C16 vftable pointer) 463 // CHECK-X64: 80 | int a 464 // CHECK-X64: | [sizeof=96, align=16 465 // CHECK-X64: | nvsize=64, nvalign=16] 466 467 468 struct A16f { 469 __declspec(align(16)) int a; 470 A16f() : a(0xf0000a16) {} 471 virtual void f() {printf("A16f");} 472 }; 473 474 struct Y { char y; Y() : y(0xaa) {} }; 475 struct X : virtual A16f {}; 476 477 struct B : A4, Y, X { 478 int a; 479 B() : a(0xf000000b) {} 480 }; 481 482 struct F0 : A4, B { 483 int a; 484 F0() : a(0xf00000f0) {} 485 virtual void g() {printf("F0");} 486 }; 487 488 // CHECK: *** Dumping AST Record Layout 489 // CHECK: 0 | struct F0 490 // CHECK: 0 | (F0 vftable pointer) 491 // CHECK: 16 | struct A4 (base) 492 // CHECK: 16 | int a 493 // CHECK: 32 | struct B (base) 494 // CHECK: 32 | struct A4 (base) 495 // CHECK: 32 | int a 496 // CHECK: 36 | struct Y (base) 497 // CHECK: 36 | char y 498 // CHECK: 48 | struct X (base) 499 // CHECK: 48 | (X vbtable pointer) 500 // CHECK: 52 | int a 501 // CHECK: 64 | int a 502 // CHECK: 80 | struct A16f (virtual base) 503 // CHECK: 80 | (A16f vftable pointer) 504 // CHECK: 96 | int a 505 // CHECK: | [sizeof=112, align=16 506 // CHECK: | nvsize=80, nvalign=16] 507 // CHECK-X64: *** Dumping AST Record Layout 508 // CHECK-X64: 0 | struct F0 509 // CHECK-X64: 0 | (F0 vftable pointer) 510 // CHECK-X64: 8 | struct A4 (base) 511 // CHECK-X64: 8 | int a 512 // CHECK-X64: 16 | struct B (base) 513 // CHECK-X64: 16 | struct A4 (base) 514 // CHECK-X64: 16 | int a 515 // CHECK-X64: 20 | struct Y (base) 516 // CHECK-X64: 20 | char y 517 // CHECK-X64: 32 | struct X (base) 518 // CHECK-X64: 32 | (X vbtable pointer) 519 // CHECK-X64: 40 | int a 520 // CHECK-X64: 48 | int a 521 // CHECK-X64: 64 | struct A16f (virtual base) 522 // CHECK-X64: 64 | (A16f vftable pointer) 523 // CHECK-X64: 80 | int a 524 // CHECK-X64: | [sizeof=96, align=16 525 // CHECK-X64: | nvsize=64, nvalign=16] 526 527 struct F1 : B, A4 { 528 int a; 529 F1() : a(0xf00000f1) {} 530 virtual void g() {printf("F1");} 531 }; 532 533 // CHECK: *** Dumping AST Record Layout 534 // CHECK: 0 | struct F1 535 // CHECK: 0 | (F1 vftable pointer) 536 // CHECK: 16 | struct B (base) 537 // CHECK: 16 | struct A4 (base) 538 // CHECK: 16 | int a 539 // CHECK: 20 | struct Y (base) 540 // CHECK: 20 | char y 541 // CHECK: 32 | struct X (base) 542 // CHECK: 32 | (X vbtable pointer) 543 // CHECK: 36 | int a 544 // CHECK: 48 | struct A4 (base) 545 // CHECK: 48 | int a 546 // CHECK: 52 | int a 547 // CHECK: 64 | struct A16f (virtual base) 548 // CHECK: 64 | (A16f vftable pointer) 549 // CHECK: 80 | int a 550 // CHECK: | [sizeof=96, align=16 551 // CHECK: | nvsize=64, nvalign=16] 552 // CHECK-X64: *** Dumping AST Record Layout 553 // CHECK-X64: 0 | struct F1 554 // CHECK-X64: 0 | (F1 vftable pointer) 555 // CHECK-X64: 16 | struct B (base) 556 // CHECK-X64: 16 | struct A4 (base) 557 // CHECK-X64: 16 | int a 558 // CHECK-X64: 20 | struct Y (base) 559 // CHECK-X64: 20 | char y 560 // CHECK-X64: 32 | struct X (base) 561 // CHECK-X64: 32 | (X vbtable pointer) 562 // CHECK-X64: 40 | int a 563 // CHECK-X64: 48 | struct A4 (base) 564 // CHECK-X64: 48 | int a 565 // CHECK-X64: 52 | int a 566 // CHECK-X64: 64 | struct A16f (virtual base) 567 // CHECK-X64: 64 | (A16f vftable pointer) 568 // CHECK-X64: 80 | int a 569 // CHECK-X64: | [sizeof=96, align=16 570 // CHECK-X64: | nvsize=64, nvalign=16] 571 572 struct F2 : A4, virtual A16f { 573 int a; 574 F2() : a(0xf00000f2) {} 575 virtual void g() {printf("F2");} 576 }; 577 578 // CHECK: *** Dumping AST Record Layout 579 // CHECK: 0 | struct F2 580 // CHECK: 0 | (F2 vftable pointer) 581 // CHECK: 4 | struct A4 (base) 582 // CHECK: 4 | int a 583 // CHECK: 8 | (F2 vbtable pointer) 584 // CHECK: 12 | int a 585 // CHECK: 16 | struct A16f (virtual base) 586 // CHECK: 16 | (A16f vftable pointer) 587 // CHECK: 32 | int a 588 // CHECK: | [sizeof=48, align=16 589 // CHECK: | nvsize=16, nvalign=4] 590 // CHECK-X64: *** Dumping AST Record Layout 591 // CHECK-X64: 0 | struct F2 592 // CHECK-X64: 0 | (F2 vftable pointer) 593 // CHECK-X64: 8 | struct A4 (base) 594 // CHECK-X64: 8 | int a 595 // CHECK-X64: 16 | (F2 vbtable pointer) 596 // CHECK-X64: 24 | int a 597 // CHECK-X64: 32 | struct A16f (virtual base) 598 // CHECK-X64: 32 | (A16f vftable pointer) 599 // CHECK-X64: 48 | int a 600 // CHECK-X64: | [sizeof=64, align=16 601 // CHECK-X64: | nvsize=32, nvalign=8] 602 603 struct F3 : A4, virtual A16f { 604 __declspec(align(16)) int a; 605 F3() : a(0xf00000f3) {} 606 virtual void g() {printf("F3");} 607 }; 608 609 // CHECK: *** Dumping AST Record Layout 610 // CHECK: 0 | struct F3 611 // CHECK: 0 | (F3 vftable pointer) 612 // CHECK: 16 | struct A4 (base) 613 // CHECK: 16 | int a 614 // CHECK: 20 | (F3 vbtable pointer) 615 // CHECK: 48 | int a 616 // CHECK: 64 | struct A16f (virtual base) 617 // CHECK: 64 | (A16f vftable pointer) 618 // CHECK: 80 | int a 619 // CHECK: | [sizeof=96, align=16 620 // CHECK: | nvsize=64, nvalign=16] 621 // CHECK-X64: *** Dumping AST Record Layout 622 // CHECK-X64: 0 | struct F3 623 // CHECK-X64: 0 | (F3 vftable pointer) 624 // CHECK-X64: 8 | struct A4 (base) 625 // CHECK-X64: 8 | int a 626 // CHECK-X64: 16 | (F3 vbtable pointer) 627 // CHECK-X64: 32 | int a 628 // CHECK-X64: 48 | struct A16f (virtual base) 629 // CHECK-X64: 48 | (A16f vftable pointer) 630 // CHECK-X64: 64 | int a 631 // CHECK-X64: | [sizeof=80, align=16 632 // CHECK-X64: | nvsize=48, nvalign=16] 633 634 struct F4 : A4, B { 635 __declspec(align(16)) int a; 636 F4() : a(0xf00000f4) {} 637 virtual void g() {printf("F4");} 638 }; 639 640 // CHECK: *** Dumping AST Record Layout 641 // CHECK: 0 | struct F4 642 // CHECK: 0 | (F4 vftable pointer) 643 // CHECK: 16 | struct A4 (base) 644 // CHECK: 16 | int a 645 // CHECK: 32 | struct B (base) 646 // CHECK: 32 | struct A4 (base) 647 // CHECK: 32 | int a 648 // CHECK: 36 | struct Y (base) 649 // CHECK: 36 | char y 650 // CHECK: 48 | struct X (base) 651 // CHECK: 48 | (X vbtable pointer) 652 // CHECK: 52 | int a 653 // CHECK: 64 | int a 654 // CHECK: 80 | struct A16f (virtual base) 655 // CHECK: 80 | (A16f vftable pointer) 656 // CHECK: 96 | int a 657 // CHECK: | [sizeof=112, align=16 658 // CHECK: | nvsize=80, nvalign=16] 659 // CHECK-X64: *** Dumping AST Record Layout 660 // CHECK-X64: 0 | struct F4 661 // CHECK-X64: 0 | (F4 vftable pointer) 662 // CHECK-X64: 8 | struct A4 (base) 663 // CHECK-X64: 8 | int a 664 // CHECK-X64: 16 | struct B (base) 665 // CHECK-X64: 16 | struct A4 (base) 666 // CHECK-X64: 16 | int a 667 // CHECK-X64: 20 | struct Y (base) 668 // CHECK-X64: 20 | char y 669 // CHECK-X64: 32 | struct X (base) 670 // CHECK-X64: 32 | (X vbtable pointer) 671 // CHECK-X64: 40 | int a 672 // CHECK-X64: 48 | int a 673 // CHECK-X64: 64 | struct A16f (virtual base) 674 // CHECK-X64: 64 | (A16f vftable pointer) 675 // CHECK-X64: 80 | int a 676 // CHECK-X64: | [sizeof=96, align=16 677 // CHECK-X64: | nvsize=64, nvalign=16] 678 679 struct F5 : A16f, virtual A4 { 680 int a; 681 F5() : a(0xf00000f5) {} 682 virtual void g() {printf("F5");} 683 }; 684 685 // CHECK: *** Dumping AST Record Layout 686 // CHECK: 0 | struct F5 687 // CHECK: 0 | struct A16f (primary base) 688 // CHECK: 0 | (A16f vftable pointer) 689 // CHECK: 16 | int a 690 // CHECK: 32 | (F5 vbtable pointer) 691 // CHECK: 48 | int a 692 // CHECK: 64 | struct A4 (virtual base) 693 // CHECK: 64 | int a 694 // CHECK: | [sizeof=80, align=16 695 // CHECK: | nvsize=64, nvalign=16] 696 // CHECK-X64: *** Dumping AST Record Layout 697 // CHECK-X64: 0 | struct F5 698 // CHECK-X64: 0 | struct A16f (primary base) 699 // CHECK-X64: 0 | (A16f vftable pointer) 700 // CHECK-X64: 16 | int a 701 // CHECK-X64: 32 | (F5 vbtable pointer) 702 // CHECK-X64: 40 | int a 703 // CHECK-X64: 48 | struct A4 (virtual base) 704 // CHECK-X64: 48 | int a 705 // CHECK-X64: | [sizeof=64, align=16 706 // CHECK-X64: | nvsize=48, nvalign=16] 707 708 struct F6 : virtual A16f, A4, virtual B { 709 int a; 710 F6() : a(0xf00000f6) {} 711 virtual void g() {printf("F6");} 712 }; 713 714 // CHECK: *** Dumping AST Record Layout 715 // CHECK: 0 | struct F6 716 // CHECK: 0 | (F6 vftable pointer) 717 // CHECK: 4 | struct A4 (base) 718 // CHECK: 4 | int a 719 // CHECK: 8 | (F6 vbtable pointer) 720 // CHECK: 12 | int a 721 // CHECK: 16 | struct A16f (virtual base) 722 // CHECK: 16 | (A16f vftable pointer) 723 // CHECK: 32 | int a 724 // CHECK: 48 | struct B (virtual base) 725 // CHECK: 48 | struct A4 (base) 726 // CHECK: 48 | int a 727 // CHECK: 52 | struct Y (base) 728 // CHECK: 52 | char y 729 // CHECK: 64 | struct X (base) 730 // CHECK: 64 | (X vbtable pointer) 731 // CHECK: 68 | int a 732 // CHECK: | [sizeof=80, align=16 733 // CHECK: | nvsize=16, nvalign=4] 734 // CHECK-X64: *** Dumping AST Record Layout 735 // CHECK-X64: 0 | struct F6 736 // CHECK-X64: 0 | (F6 vftable pointer) 737 // CHECK-X64: 8 | struct A4 (base) 738 // CHECK-X64: 8 | int a 739 // CHECK-X64: 16 | (F6 vbtable pointer) 740 // CHECK-X64: 24 | int a 741 // CHECK-X64: 32 | struct A16f (virtual base) 742 // CHECK-X64: 32 | (A16f vftable pointer) 743 // CHECK-X64: 48 | int a 744 // CHECK-X64: 64 | struct B (virtual base) 745 // CHECK-X64: 64 | struct A4 (base) 746 // CHECK-X64: 64 | int a 747 // CHECK-X64: 68 | struct Y (base) 748 // CHECK-X64: 68 | char y 749 // CHECK-X64: 80 | struct X (base) 750 // CHECK-X64: 80 | (X vbtable pointer) 751 // CHECK-X64: 88 | int a 752 // CHECK-X64: | [sizeof=96, align=16 753 // CHECK-X64: | nvsize=32, nvalign=8] 754 755 int a[ 756 sizeof(TestF0)+ 757 sizeof(TestF1)+ 758 sizeof(TestF2)+ 759 sizeof(TestF3)+ 760 sizeof(TestF4)+ 761 sizeof(TestF5)+ 762 sizeof(TestF6)+ 763 sizeof(TestF7)+ 764 sizeof(TestF8)+ 765 sizeof(TestF9)+ 766 sizeof(TestFA)+ 767 sizeof(TestFB)+ 768 sizeof(TestFC)+ 769 sizeof(F0)+ 770 sizeof(F1)+ 771 sizeof(F2)+ 772 sizeof(F3)+ 773 sizeof(F4)+ 774 sizeof(F5)+ 775 sizeof(F6)]; 776