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