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