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 4 extern "C" int printf(const char *fmt, ...); 5 6 struct A4 { 7 int a; 8 A4() : a(0xf00000a4) {} 9 }; 10 11 struct B4 { 12 int a; 13 B4() : a(0xf00000b4) {} 14 }; 15 16 struct C4 { 17 int a; 18 C4() : a(0xf00000c4) {} 19 virtual void f() {printf("C4");} 20 }; 21 22 struct A16 { 23 __declspec(align(16)) int a; 24 A16() : a(0xf0000a16) {} 25 }; 26 27 struct C16 { 28 __declspec(align(16)) int a; 29 C16() : a(0xf0000c16) {} 30 virtual void f() {printf("C16");} 31 }; 32 33 struct TestF0 : A4, virtual B4 { 34 int a; 35 TestF0() : a(0xf00000F0) {} 36 }; 37 38 // CHECK: *** Dumping AST Record Layout 39 // CHECK: 0 | struct TestF0 40 // CHECK: 0 | struct A4 (base) 41 // CHECK: 0 | int a 42 // CHECK: 4 | (TestF0 vbtable pointer) 43 // CHECK: 8 | int a 44 // CHECK: 12 | struct B4 (virtual base) 45 // CHECK: 12 | int a 46 // CHECK: | [sizeof=16, align=4 47 // CHECK: | nvsize=12, nvalign=4] 48 49 struct TestF1 : A4, virtual A16 { 50 int a; 51 TestF1() : a(0xf00000f1) {} 52 }; 53 54 // CHECK: *** Dumping AST Record Layout 55 // CHECK: 0 | struct TestF1 56 // CHECK: 0 | struct A4 (base) 57 // CHECK: 0 | int a 58 // CHECK: 4 | (TestF1 vbtable pointer) 59 // CHECK: 8 | int a 60 // CHECK: 16 | struct A16 (virtual base) 61 // CHECK: 16 | int a 62 // CHECK: | [sizeof=32, align=16 63 // CHECK: | nvsize=12, nvalign=4] 64 65 struct TestF2 : A4, virtual C4 { 66 int a; 67 TestF2() : a(0xf00000f2) {} 68 }; 69 70 // CHECK: *** Dumping AST Record Layout 71 // CHECK: 0 | struct TestF2 72 // CHECK: 0 | struct A4 (base) 73 // CHECK: 0 | int a 74 // CHECK: 4 | (TestF2 vbtable pointer) 75 // CHECK: 8 | int a 76 // CHECK: 12 | struct C4 (virtual base) 77 // CHECK: 12 | (C4 vftable pointer) 78 // CHECK: 16 | int a 79 // CHECK: | [sizeof=20, align=4 80 // CHECK: | nvsize=12, nvalign=4] 81 82 struct TestF3 : A4, virtual C16 { 83 int a; 84 TestF3() : a(0xf00000f3) {} 85 }; 86 87 // CHECK: *** Dumping AST Record Layout 88 // CHECK: 0 | struct TestF3 89 // CHECK: 0 | struct A4 (base) 90 // CHECK: 0 | int a 91 // CHECK: 4 | (TestF3 vbtable pointer) 92 // CHECK: 8 | int a 93 // CHECK: 16 | struct C16 (virtual base) 94 // CHECK: 16 | (C16 vftable pointer) 95 // CHECK: 32 | int a 96 // CHECK: | [sizeof=48, align=16 97 // CHECK: | nvsize=12, nvalign=4] 98 99 struct TestF4 : TestF3, A4 { 100 int a; 101 TestF4() : a(0xf00000f4) {} 102 }; 103 104 // CHECK: *** Dumping AST Record Layout 105 // CHECK: 0 | struct TestF4 106 // CHECK: 0 | struct TestF3 (base) 107 // CHECK: 0 | struct A4 (base) 108 // CHECK: 0 | int a 109 // CHECK: 4 | (TestF3 vbtable pointer) 110 // CHECK: 8 | int a 111 // CHECK: 12 | struct A4 (base) 112 // CHECK: 12 | int a 113 // CHECK: 16 | int a 114 // CHECK: 32 | struct C16 (virtual base) 115 // CHECK: 32 | (C16 vftable pointer) 116 // CHECK: 48 | int a 117 // CHECK: | [sizeof=64, align=16 118 // CHECK: | nvsize=32, nvalign=16] 119 120 struct TestF5 : TestF3, A4 { 121 int a; 122 TestF5() : a(0xf00000f5) {} 123 virtual void g() {printf("F5");} 124 }; 125 126 // CHECK: *** Dumping AST Record Layout 127 // CHECK: 0 | struct TestF5 128 // CHECK: 0 | (TestF5 vftable pointer) 129 // CHECK: 16 | struct TestF3 (base) 130 // CHECK: 16 | struct A4 (base) 131 // CHECK: 16 | int a 132 // CHECK: 20 | (TestF3 vbtable pointer) 133 // CHECK: 24 | int a 134 // CHECK: 28 | struct A4 (base) 135 // CHECK: 28 | int a 136 // CHECK: 32 | int a 137 // CHECK: 48 | struct C16 (virtual base) 138 // CHECK: 48 | (C16 vftable pointer) 139 // CHECK: 64 | int a 140 // CHECK: | [sizeof=80, align=16 141 // CHECK: | nvsize=48, nvalign=16] 142 143 struct TestF6 : TestF3, A4 { 144 int a; 145 TestF6() : a(0xf00000f6) {} 146 virtual void f() {printf("F6");} 147 }; 148 149 // CHECK: *** Dumping AST Record Layout 150 // CHECK: 0 | struct TestF6 151 // CHECK: 0 | struct TestF3 (base) 152 // CHECK: 0 | struct A4 (base) 153 // CHECK: 0 | int a 154 // CHECK: 4 | (TestF3 vbtable pointer) 155 // CHECK: 8 | int a 156 // CHECK: 12 | struct A4 (base) 157 // CHECK: 12 | int a 158 // CHECK: 16 | int a 159 // CHECK: 44 | (vtordisp for vbase C16) 160 // CHECK: 48 | struct C16 (virtual base) 161 // CHECK: 48 | (C16 vftable pointer) 162 // CHECK: 64 | int a 163 // CHECK: | [sizeof=80, align=16 164 // CHECK: | nvsize=32, nvalign=16] 165 166 struct TestF7 : A4, virtual C16 { 167 int a; 168 TestF7() : a(0xf00000f7) {} 169 virtual void f() {printf("F7");} 170 }; 171 172 // CHECK: *** Dumping AST Record Layout 173 // CHECK: 0 | struct TestF7 174 // CHECK: 0 | struct A4 (base) 175 // CHECK: 0 | int a 176 // CHECK: 4 | (TestF7 vbtable pointer) 177 // CHECK: 8 | int a 178 // CHECK: 28 | (vtordisp for vbase C16) 179 // CHECK: 32 | struct C16 (virtual base) 180 // CHECK: 32 | (C16 vftable pointer) 181 // CHECK: 48 | int a 182 // CHECK: | [sizeof=64, align=16 183 // CHECK: | nvsize=12, nvalign=4] 184 185 struct TestF8 : TestF7, A4 { 186 int a; 187 TestF8() : a(0xf00000f8) {} 188 virtual void f() {printf("F8");} 189 }; 190 191 // CHECK: *** Dumping AST Record Layout 192 // CHECK: 0 | struct TestF8 193 // CHECK: 0 | struct TestF7 (base) 194 // CHECK: 0 | struct A4 (base) 195 // CHECK: 0 | int a 196 // CHECK: 4 | (TestF7 vbtable pointer) 197 // CHECK: 8 | int a 198 // CHECK: 12 | struct A4 (base) 199 // CHECK: 12 | int a 200 // CHECK: 16 | int a 201 // CHECK: 44 | (vtordisp for vbase C16) 202 // CHECK: 48 | struct C16 (virtual base) 203 // CHECK: 48 | (C16 vftable pointer) 204 // CHECK: 64 | int a 205 // CHECK: | [sizeof=80, align=16 206 // CHECK: | nvsize=32, nvalign=16] 207 208 struct TestF9 : A4, virtual C16 { 209 int a; 210 TestF9() : a(0xf00000f9) {} 211 virtual void g() {printf("F9");} 212 }; 213 214 // CHECK: *** Dumping AST Record Layout 215 // CHECK: 0 | struct TestF9 216 // CHECK: 0 | (TestF9 vftable pointer) 217 // CHECK: 4 | struct A4 (base) 218 // CHECK: 4 | int a 219 // CHECK: 8 | (TestF9 vbtable pointer) 220 // CHECK: 12 | int a 221 // CHECK: 16 | struct C16 (virtual base) 222 // CHECK: 16 | (C16 vftable pointer) 223 // CHECK: 32 | int a 224 // CHECK: | [sizeof=48, align=16 225 // CHECK: | nvsize=16, nvalign=4] 226 227 struct TestFA : TestF9, A4 { 228 int a; 229 TestFA() : a(0xf00000fa) {} 230 virtual void g() {printf("FA");} 231 }; 232 233 // CHECK: *** Dumping AST Record Layout 234 // CHECK: 0 | struct TestFA 235 // CHECK: 0 | struct TestF9 (primary base) 236 // CHECK: 0 | (TestF9 vftable pointer) 237 // CHECK: 4 | struct A4 (base) 238 // CHECK: 4 | int a 239 // CHECK: 8 | (TestF9 vbtable pointer) 240 // CHECK: 12 | int a 241 // CHECK: 16 | struct A4 (base) 242 // CHECK: 16 | int a 243 // CHECK: 20 | int a 244 // CHECK: 32 | struct C16 (virtual base) 245 // CHECK: 32 | (C16 vftable pointer) 246 // CHECK: 48 | int a 247 // CHECK: | [sizeof=64, align=16 248 // CHECK: | nvsize=32, nvalign=16] 249 250 struct TestFB : A16, virtual C16 { 251 int a; 252 TestFB() : a(0xf00000fb) {} 253 virtual void g() {printf("Fb");} 254 }; 255 256 // CHECK: *** Dumping AST Record Layout 257 // CHECK: 0 | struct TestFB 258 // CHECK: 0 | (TestFB vftable pointer) 259 // CHECK: 16 | struct A16 (base) 260 // CHECK: 16 | int a 261 // CHECK: 32 | (TestFB vbtable pointer) 262 // CHECK: 48 | int a 263 // CHECK: 64 | struct C16 (virtual base) 264 // CHECK: 64 | (C16 vftable pointer) 265 // CHECK: 80 | int a 266 // CHECK: | [sizeof=96, align=16 267 // CHECK: | nvsize=64, nvalign=16] 268 269 struct TestFC : TestFB, A4 { 270 int a; 271 TestFC() : a(0xf00000fc) {} 272 virtual void g() {printf("FC");} 273 }; 274 275 // CHECK: *** Dumping AST Record Layout 276 // CHECK: 0 | struct TestFC 277 // CHECK: 0 | struct TestFB (primary base) 278 // CHECK: 0 | (TestFB vftable pointer) 279 // CHECK: 16 | struct A16 (base) 280 // CHECK: 16 | int a 281 // CHECK: 32 | (TestFB vbtable pointer) 282 // CHECK: 48 | int a 283 // CHECK: 64 | struct A4 (base) 284 // CHECK: 64 | int a 285 // CHECK: 68 | int a 286 // CHECK: 80 | struct C16 (virtual base) 287 // CHECK: 80 | (C16 vftable pointer) 288 // CHECK: 96 | int a 289 // CHECK: | [sizeof=112, align=16 290 // CHECK: | nvsize=80, nvalign=16] 291 292 293 struct A16f { 294 __declspec(align(16)) int a; 295 A16f() : a(0xf0000a16) {} 296 virtual void f() {printf("A16f");} 297 }; 298 299 struct Y { char y; Y() : y(0xaa) {} }; 300 struct X : virtual A16f {}; 301 302 struct B : A4, Y, X { 303 int a; 304 B() : a(0xf000000b) {} 305 }; 306 307 struct F0 : A4, B { 308 int a; 309 F0() : a(0xf00000f0) {} 310 virtual void g() {printf("F0");} 311 }; 312 313 // CHECK: *** Dumping AST Record Layout 314 // CHECK: 0 | struct F0 315 // CHECK: 0 | (F0 vftable pointer) 316 // CHECK: 16 | struct A4 (base) 317 // CHECK: 16 | int a 318 // CHECK: 32 | struct B (base) 319 // CHECK: 32 | struct A4 (base) 320 // CHECK: 32 | int a 321 // CHECK: 36 | struct Y (base) 322 // CHECK: 36 | char y 323 // CHECK: 48 | struct X (base) 324 // CHECK: 48 | (X vbtable pointer) 325 // CHECK: 52 | int a 326 // CHECK: 64 | int a 327 // CHECK: 80 | struct A16f (virtual base) 328 // CHECK: 80 | (A16f vftable pointer) 329 // CHECK: 96 | int a 330 // CHECK: | [sizeof=112, align=16 331 // CHECK: | nvsize=80, nvalign=16] 332 333 struct F1 : B, A4 { 334 int a; 335 F1() : a(0xf00000f1) {} 336 virtual void g() {printf("F1");} 337 }; 338 339 // CHECK: *** Dumping AST Record Layout 340 // CHECK: 0 | struct F1 341 // CHECK: 0 | (F1 vftable pointer) 342 // CHECK: 16 | struct B (base) 343 // CHECK: 16 | struct A4 (base) 344 // CHECK: 16 | int a 345 // CHECK: 20 | struct Y (base) 346 // CHECK: 20 | char y 347 // CHECK: 32 | struct X (base) 348 // CHECK: 32 | (X vbtable pointer) 349 // CHECK: 36 | int a 350 // CHECK: 48 | struct A4 (base) 351 // CHECK: 48 | int a 352 // CHECK: 52 | int a 353 // CHECK: 64 | struct A16f (virtual base) 354 // CHECK: 64 | (A16f vftable pointer) 355 // CHECK: 80 | int a 356 // CHECK: | [sizeof=96, align=16 357 // CHECK: | nvsize=64, nvalign=16] 358 359 struct F2 : A4, virtual A16f { 360 int a; 361 F2() : a(0xf00000f2) {} 362 virtual void g() {printf("F2");} 363 }; 364 365 // CHECK: *** Dumping AST Record Layout 366 // CHECK: 0 | struct F2 367 // CHECK: 0 | (F2 vftable pointer) 368 // CHECK: 4 | struct A4 (base) 369 // CHECK: 4 | int a 370 // CHECK: 8 | (F2 vbtable pointer) 371 // CHECK: 12 | int a 372 // CHECK: 16 | struct A16f (virtual base) 373 // CHECK: 16 | (A16f vftable pointer) 374 // CHECK: 32 | int a 375 // CHECK: | [sizeof=48, align=16 376 // CHECK: | nvsize=16, nvalign=4] 377 378 struct F3 : A4, virtual A16f { 379 __declspec(align(16)) int a; 380 F3() : a(0xf00000f3) {} 381 virtual void g() {printf("F3");} 382 }; 383 384 // CHECK: *** Dumping AST Record Layout 385 // CHECK: 0 | struct F3 386 // CHECK: 0 | (F3 vftable pointer) 387 // CHECK: 16 | struct A4 (base) 388 // CHECK: 16 | int a 389 // CHECK: 20 | (F3 vbtable pointer) 390 // CHECK: 48 | int a 391 // CHECK: 64 | struct A16f (virtual base) 392 // CHECK: 64 | (A16f vftable pointer) 393 // CHECK: 80 | int a 394 // CHECK: | [sizeof=96, align=16 395 // CHECK: | nvsize=64, nvalign=16] 396 397 struct F4 : A4, B { 398 __declspec(align(16)) int a; 399 F4() : a(0xf00000f4) {} 400 virtual void g() {printf("F4");} 401 }; 402 403 // CHECK: *** Dumping AST Record Layout 404 // CHECK: 0 | struct F4 405 // CHECK: 0 | (F4 vftable pointer) 406 // CHECK: 16 | struct A4 (base) 407 // CHECK: 16 | int a 408 // CHECK: 32 | struct B (base) 409 // CHECK: 32 | struct A4 (base) 410 // CHECK: 32 | int a 411 // CHECK: 36 | struct Y (base) 412 // CHECK: 36 | char y 413 // CHECK: 48 | struct X (base) 414 // CHECK: 48 | (X vbtable pointer) 415 // CHECK: 52 | int a 416 // CHECK: 64 | int a 417 // CHECK: 80 | struct A16f (virtual base) 418 // CHECK: 80 | (A16f vftable pointer) 419 // CHECK: 96 | int a 420 // CHECK: | [sizeof=112, align=16 421 // CHECK: | nvsize=80, nvalign=16] 422 423 struct F5 : A16f, virtual A4 { 424 int a; 425 F5() : a(0xf00000f5) {} 426 virtual void g() {printf("F5");} 427 }; 428 429 // CHECK: *** Dumping AST Record Layout 430 // CHECK: 0 | struct F5 431 // CHECK: 0 | struct A16f (primary base) 432 // CHECK: 0 | (A16f vftable pointer) 433 // CHECK: 16 | int a 434 // CHECK: 32 | (F5 vbtable pointer) 435 // CHECK: 48 | int a 436 // CHECK: 64 | struct A4 (virtual base) 437 // CHECK: 64 | int a 438 // CHECK: | [sizeof=80, align=16 439 // CHECK: | nvsize=64, nvalign=16] 440 441 struct F6 : virtual A16f, A4, virtual B { 442 int a; 443 F6() : a(0xf00000f6) {} 444 virtual void g() {printf("F6");} 445 }; 446 447 // CHECK: *** Dumping AST Record Layout 448 // CHECK: 0 | struct F6 449 // CHECK: 0 | (F6 vftable pointer) 450 // CHECK: 4 | struct A4 (base) 451 // CHECK: 4 | int a 452 // CHECK: 8 | (F6 vbtable pointer) 453 // CHECK: 12 | int a 454 // CHECK: 16 | struct A16f (virtual base) 455 // CHECK: 16 | (A16f vftable pointer) 456 // CHECK: 32 | int a 457 // CHECK: 48 | struct B (virtual base) 458 // CHECK: 48 | struct A4 (base) 459 // CHECK: 48 | int a 460 // CHECK: 52 | struct Y (base) 461 // CHECK: 52 | char y 462 // CHECK: 64 | struct X (base) 463 // CHECK: 64 | (X vbtable pointer) 464 // CHECK: 68 | int a 465 // CHECK: | [sizeof=80, align=16 466 // CHECK: | nvsize=16, nvalign=4] 467 468 int a[ 469 sizeof(TestF0)+ 470 sizeof(TestF1)+ 471 sizeof(TestF2)+ 472 sizeof(TestF3)+ 473 sizeof(TestF4)+ 474 sizeof(TestF5)+ 475 sizeof(TestF6)+ 476 sizeof(TestF7)+ 477 sizeof(TestF8)+ 478 sizeof(TestF9)+ 479 sizeof(TestFA)+ 480 sizeof(TestFB)+ 481 sizeof(TestFC)+ 482 sizeof(F0)+ 483 sizeof(F1)+ 484 sizeof(F2)+ 485 sizeof(F3)+ 486 sizeof(F4)+ 487 sizeof(F5)+ 488 sizeof(F6)]; 489