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