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 __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 9 struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 10 struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 11 struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 12 struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 13 14 struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 15 struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 16 struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 17 struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 18 struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 19 20 struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} }; 21 struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 22 struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} }; 23 24 struct A : virtual B0 { 25 int a; 26 A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 27 }; 28 29 // CHECK: *** Dumping AST Record Layout 30 // CHECK: 0 | struct A 31 // CHECK: 0 | (A vbtable pointer) 32 // CHECK: 4 | int a 33 // CHECK: 8 | struct B0 (virtual base) (empty) 34 // CHECK: | [sizeof=8, align=8 35 // CHECK: | nvsize=8, nvalign=4] 36 // CHECK-X64: *** Dumping AST Record Layout 37 // CHECK-X64: 0 | struct A 38 // CHECK-X64: 0 | (A vbtable pointer) 39 // CHECK-X64: 8 | int a 40 // CHECK-X64: 16 | struct B0 (virtual base) (empty) 41 // CHECK-X64: | [sizeof=16, align=8 42 // CHECK-X64: | nvsize=16, nvalign=8] 43 44 struct B : virtual B0 { 45 B0 b0; 46 int a; 47 B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 48 }; 49 50 // CHECK: *** Dumping AST Record Layout 51 // CHECK: 0 | struct B 52 // CHECK: 0 | (B vbtable pointer) 53 // CHECK: 8 | struct B0 b0 (empty) 54 // CHECK: | [sizeof=8, align=8 55 // CHECK: | nvsize=0, nvalign=1] 56 // CHECK: 16 | int a 57 // CHECK: 24 | struct B0 (virtual base) (empty) 58 // CHECK: | [sizeof=24, align=8 59 // CHECK: | nvsize=24, nvalign=8] 60 // CHECK-X64: *** Dumping AST Record Layout 61 // CHECK-X64: 0 | struct B 62 // CHECK-X64: 0 | (B vbtable pointer) 63 // CHECK-X64: 8 | struct B0 b0 (empty) 64 // CHECK-X64: | [sizeof=8, align=8 65 // CHECK-X64: | nvsize=0, nvalign=1] 66 // CHECK-X64: 16 | int a 67 // CHECK-X64: 24 | struct B0 (virtual base) (empty) 68 // CHECK-X64: | [sizeof=24, align=8 69 // CHECK-X64: | nvsize=24, nvalign=8] 70 71 struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 { 72 int a; 73 C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 74 }; 75 76 // CHECK: *** Dumping AST Record Layout 77 // CHECK: 0 | struct C 78 // CHECK: 0 | (C vbtable pointer) 79 // CHECK: 4 | int a 80 // CHECK: 8 | struct B0 (virtual base) (empty) 81 // CHECK: 16 | struct B1 (virtual base) (empty) 82 // CHECK: 24 | struct B2 (virtual base) (empty) 83 // CHECK: 32 | struct B3 (virtual base) (empty) 84 // CHECK: 40 | struct B4 (virtual base) (empty) 85 // CHECK: | [sizeof=40, align=8 86 // CHECK: | nvsize=8, nvalign=4] 87 // CHECK-X64: *** Dumping AST Record Layout 88 // CHECK-X64: 0 | struct C 89 // CHECK-X64: 0 | (C vbtable pointer) 90 // CHECK-X64: 8 | int a 91 // CHECK-X64: 16 | struct B0 (virtual base) (empty) 92 // CHECK-X64: 24 | struct B1 (virtual base) (empty) 93 // CHECK-X64: 32 | struct B2 (virtual base) (empty) 94 // CHECK-X64: 40 | struct B3 (virtual base) (empty) 95 // CHECK-X64: 48 | struct B4 (virtual base) (empty) 96 // CHECK-X64: | [sizeof=48, align=8 97 // CHECK-X64: | nvsize=16, nvalign=8] 98 99 struct D { 100 B0 b0; 101 C0 c0; 102 C1 c1; 103 C2 c2; 104 B1 b1; 105 int a; 106 D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 107 }; 108 109 // CHECK: *** Dumping AST Record Layout 110 // CHECK: 0 | struct D 111 // CHECK: 0 | struct B0 b0 (empty) 112 // CHECK: 8 | struct C0 c0 113 // CHECK: 8 | int a 114 // CHECK: 12 | struct C1 c1 115 // CHECK: 12 | int a 116 // CHECK: 16 | struct C2 c2 117 // CHECK: 16 | int a 118 // CHECK: 24 | struct B1 b1 (empty) 119 // CHECK: 32 | int a 120 // CHECK: | [sizeof=40, align=8 121 // CHECK: | nvsize=40, nvalign=8] 122 // CHECK-64: *** Dumping AST Record Layout 123 // CHECK-64: 0 | struct D 124 // CHECK-64: 0 | struct B0 b0 (empty) 125 // CHECK-64: 8 | struct C0 c0 126 // CHECK-64: 8 | int a 127 // CHECK-64: 12 | struct C1 c1 128 // CHECK-64: 12 | int a 129 // CHECK-64: 16 | struct C2 c2 130 // CHECK-64: 16 | int a 131 // CHECK-64: 24 | struct B1 b1 (empty) 132 // CHECK-64: 32 | int a 133 // CHECK-64: | [sizeof=40, align=8 134 // CHECK-64: | nvsize=40, nvalign=8] 135 136 struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 { 137 int a; 138 E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 139 }; 140 141 // CHECK: *** Dumping AST Record Layout 142 // CHECK: 0 | struct E 143 // CHECK: 0 | (E vbtable pointer) 144 // CHECK: 4 | int a 145 // CHECK: 8 | struct B0 (virtual base) (empty) 146 // CHECK: 8 | struct C0 (virtual base) 147 // CHECK: 8 | int a 148 // CHECK: 12 | struct C1 (virtual base) 149 // CHECK: 12 | int a 150 // CHECK: 16 | struct C2 (virtual base) 151 // CHECK: 16 | int a 152 // CHECK: 24 | struct B1 (virtual base) (empty) 153 // CHECK: | [sizeof=24, align=8 154 // CHECK: | nvsize=8, nvalign=4] 155 // CHECK-X64: *** Dumping AST Record Layout 156 // CHECK-X64: 0 | struct E 157 // CHECK-X64: 0 | (E vbtable pointer) 158 // CHECK-X64: 8 | int a 159 // CHECK-X64: 16 | struct B0 (virtual base) (empty) 160 // CHECK-X64: 16 | struct C0 (virtual base) 161 // CHECK-X64: 16 | int a 162 // CHECK-X64: 20 | struct C1 (virtual base) 163 // CHECK-X64: 20 | int a 164 // CHECK-X64: 24 | struct C2 (virtual base) 165 // CHECK-X64: 24 | int a 166 // CHECK-X64: 32 | struct B1 (virtual base) (empty) 167 // CHECK-X64: | [sizeof=32, align=8 168 // CHECK-X64: | nvsize=16, nvalign=8] 169 170 struct F : virtual C0, virtual B0, virtual B1, virtual C1 { 171 int a; 172 F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 173 }; 174 175 // CHECK: *** Dumping AST Record Layout 176 // CHECK: 0 | struct F 177 // CHECK: 0 | (F vbtable pointer) 178 // CHECK: 4 | int a 179 // CHECK: 8 | struct C0 (virtual base) 180 // CHECK: 8 | int a 181 // CHECK: 16 | struct B0 (virtual base) (empty) 182 // CHECK: 24 | struct B1 (virtual base) (empty) 183 // CHECK: 24 | struct C1 (virtual base) 184 // CHECK: 24 | int a 185 // CHECK: | [sizeof=32, align=8 186 // CHECK: | nvsize=8, nvalign=4] 187 // CHECK-X64: *** Dumping AST Record Layout 188 // CHECK-X64: 0 | struct F 189 // CHECK-X64: 0 | (F vbtable pointer) 190 // CHECK-X64: 8 | int a 191 // CHECK-X64: 16 | struct C0 (virtual base) 192 // CHECK-X64: 16 | int a 193 // CHECK-X64: 24 | struct B0 (virtual base) (empty) 194 // CHECK-X64: 32 | struct B1 (virtual base) (empty) 195 // CHECK-X64: 32 | struct C1 (virtual base) 196 // CHECK-X64: 32 | int a 197 // CHECK-X64: | [sizeof=40, align=8 198 // CHECK-X64: | nvsize=16, nvalign=8] 199 200 struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 { 201 int a; 202 G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 203 virtual void f() {} 204 }; 205 206 // CHECK: *** Dumping AST Record Layout 207 // CHECK: 0 | struct G 208 // CHECK: 0 | struct D0 (primary base) 209 // CHECK: 0 | (D0 vftable pointer) 210 // CHECK: 4 | (G vbtable pointer) 211 // CHECK: 20 | int a 212 // CHECK: 32 | struct C0 (virtual base) 213 // CHECK: 32 | int a 214 // CHECK: 40 | struct B0 (virtual base) (empty) 215 // CHECK: 56 | struct B1 (virtual base) (empty) 216 // CHECK: 56 | struct C1 (virtual base) 217 // CHECK: 56 | int a 218 // CHECK: | [sizeof=64, align=16 219 // CHECK: | nvsize=32, nvalign=16] 220 // CHECK-X64: *** Dumping AST Record Layout 221 // CHECK-X64: 0 | struct G 222 // CHECK-X64: 0 | struct D0 (primary base) 223 // CHECK-X64: 0 | (D0 vftable pointer) 224 // CHECK-X64: 8 | (G vbtable pointer) 225 // CHECK-X64: 16 | int a 226 // CHECK-X64: 32 | struct C0 (virtual base) 227 // CHECK-X64: 32 | int a 228 // CHECK-X64: 40 | struct B0 (virtual base) (empty) 229 // CHECK-X64: 56 | struct B1 (virtual base) (empty) 230 // CHECK-X64: 56 | struct C1 (virtual base) 231 // CHECK-X64: 56 | int a 232 // CHECK-X64: | [sizeof=64, align=16 233 // CHECK-X64: | nvsize=32, nvalign=16] 234 235 struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 { 236 int a; 237 H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 238 virtual void f() {} 239 }; 240 241 // CHECK: *** Dumping AST Record Layout 242 // CHECK: 0 | struct H 243 // CHECK: 0 | (H vbtable pointer) 244 // CHECK: 4 | int a 245 // CHECK: 8 | struct C0 (virtual base) 246 // CHECK: 8 | int a 247 // CHECK: 16 | struct B0 (virtual base) (empty) 248 // CHECK: 24 | struct B1 (virtual base) (empty) 249 // CHECK: 44 | (vtordisp for vbase D0) 250 // CHECK: 48 | struct D0 (virtual base) 251 // CHECK: 48 | (D0 vftable pointer) 252 // CHECK: 52 | struct C1 (virtual base) 253 // CHECK: 52 | int a 254 // CHECK: | [sizeof=64, align=16 255 // CHECK: | nvsize=8, nvalign=4] 256 // CHECK-X64: *** Dumping AST Record Layout 257 // CHECK-X64: 0 | struct H 258 // CHECK-X64: 0 | (H vbtable pointer) 259 // CHECK-X64: 8 | int a 260 // CHECK-X64: 16 | struct C0 (virtual base) 261 // CHECK-X64: 16 | int a 262 // CHECK-X64: 24 | struct B0 (virtual base) (empty) 263 // CHECK-X64: 40 | struct B1 (virtual base) (empty) 264 // CHECK-X64: 60 | (vtordisp for vbase D0) 265 // CHECK-X64: 64 | struct D0 (virtual base) 266 // CHECK-X64: 64 | (D0 vftable pointer) 267 // CHECK-X64: 72 | struct C1 (virtual base) 268 // CHECK-X64: 72 | int a 269 // CHECK-X64: | [sizeof=80, align=16 270 // CHECK-X64: | nvsize=16, nvalign=8] 271 272 struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 { 273 __declspec(align(32)) int a; 274 I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 275 }; 276 277 // CHECK: *** Dumping AST Record Layout 278 // CHECK: 0 | struct I 279 // CHECK: 0 | (I vbtable pointer) 280 // CHECK: 32 | int a 281 // CHECK: 64 | struct B0 (virtual base) (empty) 282 // CHECK: 72 | struct B1 (virtual base) (empty) 283 // CHECK: 104 | struct B2 (virtual base) (empty) 284 // CHECK: 136 | struct B3 (virtual base) (empty) 285 // CHECK: 168 | struct B4 (virtual base) (empty) 286 // CHECK: | [sizeof=192, align=32 287 // CHECK: | nvsize=64, nvalign=32] 288 // CHECK-X64: *** Dumping AST Record Layout 289 // CHECK-X64: 0 | struct I 290 // CHECK-X64: 0 | (I vbtable pointer) 291 // CHECK-X64: 32 | int a 292 // CHECK-X64: 64 | struct B0 (virtual base) (empty) 293 // CHECK-X64: 72 | struct B1 (virtual base) (empty) 294 // CHECK-X64: 104 | struct B2 (virtual base) (empty) 295 // CHECK-X64: 136 | struct B3 (virtual base) (empty) 296 // CHECK-X64: 168 | struct B4 (virtual base) (empty) 297 // CHECK-X64: | [sizeof=192, align=32 298 // CHECK-X64: | nvsize=64, nvalign=32] 299 300 struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 { 301 int a; 302 J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 303 }; 304 305 // CHECK: *** Dumping AST Record Layout 306 // CHECK: 0 | struct J 307 // CHECK: 0 | (J vbtable pointer) 308 // CHECK: 4 | int a 309 // CHECK: 8 | struct B0 (virtual base) (empty) 310 // CHECK: 40 | struct B1 (virtual base) (empty) 311 // CHECK: 72 | struct B2 (virtual base) (empty) 312 // CHECK: 104 | struct B3 (virtual base) (empty) 313 // CHECK: 136 | struct B4 (virtual base) (empty) 314 // CHECK: | [sizeof=160, align=32 315 // CHECK: | nvsize=8, nvalign=4] 316 // CHECK-X64: *** Dumping AST Record Layout 317 // CHECK-X64: 0 | struct J 318 // CHECK-X64: 0 | (J vbtable pointer) 319 // CHECK-X64: 8 | int a 320 // CHECK-X64: 16 | struct B0 (virtual base) (empty) 321 // CHECK-X64: 40 | struct B1 (virtual base) (empty) 322 // CHECK-X64: 72 | struct B2 (virtual base) (empty) 323 // CHECK-X64: 104 | struct B3 (virtual base) (empty) 324 // CHECK-X64: 136 | struct B4 (virtual base) (empty) 325 // CHECK-X64: | [sizeof=160, align=32 326 // CHECK-X64: | nvsize=16, nvalign=8] 327 328 struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 { 329 __declspec(align(32)) int a; 330 K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 331 }; 332 333 // CHECK: *** Dumping AST Record Layout 334 // CHECK: 0 | struct K 335 // CHECK: 0 | (K vbtable pointer) 336 // CHECK: 32 | int a 337 // CHECK: 64 | struct D1 (virtual base) (empty) 338 // CHECK: 72 | struct B1 (virtual base) (empty) 339 // CHECK: 104 | struct B2 (virtual base) (empty) 340 // CHECK: 136 | struct B3 (virtual base) (empty) 341 // CHECK: 168 | struct B4 (virtual base) (empty) 342 // CHECK: | [sizeof=192, align=32 343 // CHECK: | nvsize=64, nvalign=32] 344 // CHECK-X64: *** Dumping AST Record Layout 345 // CHECK-X64: 0 | struct K 346 // CHECK-X64: 0 | (K vbtable pointer) 347 // CHECK-X64: 32 | int a 348 // CHECK-X64: 64 | struct D1 (virtual base) (empty) 349 // CHECK-X64: 72 | struct B1 (virtual base) (empty) 350 // CHECK-X64: 104 | struct B2 (virtual base) (empty) 351 // CHECK-X64: 136 | struct B3 (virtual base) (empty) 352 // CHECK-X64: 168 | struct B4 (virtual base) (empty) 353 // CHECK-X64: | [sizeof=192, align=32 354 // CHECK-X64: | nvsize=64, nvalign=32] 355 356 struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 { 357 __declspec(align(32)) int a; 358 L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 359 }; 360 361 // CHECK: *** Dumping AST Record Layout 362 // CHECK: 0 | struct L 363 // CHECK: 0 | (L vbtable pointer) 364 // CHECK: 32 | int a 365 // CHECK: 64 | struct B1 (virtual base) (empty) 366 // CHECK: 68 | struct D1 (virtual base) (empty) 367 // CHECK: 104 | struct B2 (virtual base) (empty) 368 // CHECK: 136 | struct B3 (virtual base) (empty) 369 // CHECK: 168 | struct B4 (virtual base) (empty) 370 // CHECK: | [sizeof=192, align=32 371 // CHECK: | nvsize=64, nvalign=32] 372 // CHECK-X64: *** Dumping AST Record Layout 373 // CHECK-X64: 0 | struct L 374 // CHECK-X64: 0 | (L vbtable pointer) 375 // CHECK-X64: 32 | int a 376 // CHECK-X64: 64 | struct B1 (virtual base) (empty) 377 // CHECK-X64: 68 | struct D1 (virtual base) (empty) 378 // CHECK-X64: 104 | struct B2 (virtual base) (empty) 379 // CHECK-X64: 136 | struct B3 (virtual base) (empty) 380 // CHECK-X64: 168 | struct B4 (virtual base) (empty) 381 // CHECK-X64: | [sizeof=192, align=32 382 // CHECK-X64: | nvsize=64, nvalign=32] 383 384 struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 { 385 __declspec(align(32)) int a; 386 M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 387 }; 388 389 // CHECK: *** Dumping AST Record Layout 390 // CHECK: 0 | struct M 391 // CHECK: 0 | (M vbtable pointer) 392 // CHECK: 32 | int a 393 // CHECK: 64 | struct B1 (virtual base) (empty) 394 // CHECK: 72 | struct B2 (virtual base) (empty) 395 // CHECK: 100 | struct D1 (virtual base) (empty) 396 // CHECK: 136 | struct B3 (virtual base) (empty) 397 // CHECK: 168 | struct B4 (virtual base) (empty) 398 // CHECK: | [sizeof=192, align=32 399 // CHECK: | nvsize=64, nvalign=32] 400 // CHECK-X64: *** Dumping AST Record Layout 401 // CHECK-X64: 0 | struct M 402 // CHECK-X64: 0 | (M vbtable pointer) 403 // CHECK-X64: 32 | int a 404 // CHECK-X64: 64 | struct B1 (virtual base) (empty) 405 // CHECK-X64: 72 | struct B2 (virtual base) (empty) 406 // CHECK-X64: 100 | struct D1 (virtual base) (empty) 407 // CHECK-X64: 136 | struct B3 (virtual base) (empty) 408 // CHECK-X64: 168 | struct B4 (virtual base) (empty) 409 // CHECK-X64: | [sizeof=192, align=32 410 // CHECK-X64: | nvsize=64, nvalign=32] 411 412 struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 { 413 __declspec(align(32)) int a; 414 N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 415 }; 416 417 // CHECK: *** Dumping AST Record Layout 418 // CHECK: 0 | struct N 419 // CHECK: 0 | (N vbtable pointer) 420 // CHECK: 32 | int a 421 // CHECK: 64 | struct C0 (virtual base) 422 // CHECK: 64 | int a 423 // CHECK: 72 | struct B1 (virtual base) (empty) 424 // CHECK: 100 | struct D1 (virtual base) (empty) 425 // CHECK: 136 | struct B2 (virtual base) (empty) 426 // CHECK: 168 | struct B3 (virtual base) (empty) 427 // CHECK: 200 | struct B4 (virtual base) (empty) 428 // CHECK: | [sizeof=224, align=32 429 // CHECK: | nvsize=64, nvalign=32] 430 // CHECK-X64: *** Dumping AST Record Layout 431 // CHECK-X64: 0 | struct N 432 // CHECK-X64: 0 | (N vbtable pointer) 433 // CHECK-X64: 32 | int a 434 // CHECK-X64: 64 | struct C0 (virtual base) 435 // CHECK-X64: 64 | int a 436 // CHECK-X64: 72 | struct B1 (virtual base) (empty) 437 // CHECK-X64: 100 | struct D1 (virtual base) (empty) 438 // CHECK-X64: 136 | struct B2 (virtual base) (empty) 439 // CHECK-X64: 168 | struct B3 (virtual base) (empty) 440 // CHECK-X64: 200 | struct B4 (virtual base) (empty) 441 // CHECK-X64: | [sizeof=224, align=32 442 // CHECK-X64: | nvsize=64, nvalign=32] 443 444 struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 { 445 __declspec(align(32)) int a; 446 O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 447 }; 448 449 // CHECK: *** Dumping AST Record Layout 450 // CHECK: 0 | struct O 451 // CHECK: 0 | (O vbtable pointer) 452 // CHECK: 32 | int a 453 // CHECK: 64 | struct C0 (virtual base) 454 // CHECK: 64 | int a 455 // CHECK: 72 | struct B1 (virtual base) (empty) 456 // CHECK: 104 | struct B2 (virtual base) (empty) 457 // CHECK: 132 | struct D1 (virtual base) (empty) 458 // CHECK: 168 | struct B3 (virtual base) (empty) 459 // CHECK: 200 | struct B4 (virtual base) (empty) 460 // CHECK: | [sizeof=224, align=32 461 // CHECK: | nvsize=64, nvalign=32] 462 // CHECK-X64: *** Dumping AST Record Layout 463 // CHECK-X64: 0 | struct O 464 // CHECK-X64: 0 | (O vbtable pointer) 465 // CHECK-X64: 32 | int a 466 // CHECK-X64: 64 | struct C0 (virtual base) 467 // CHECK-X64: 64 | int a 468 // CHECK-X64: 72 | struct B1 (virtual base) (empty) 469 // CHECK-X64: 104 | struct B2 (virtual base) (empty) 470 // CHECK-X64: 132 | struct D1 (virtual base) (empty) 471 // CHECK-X64: 168 | struct B3 (virtual base) (empty) 472 // CHECK-X64: 200 | struct B4 (virtual base) (empty) 473 // CHECK-X64: | [sizeof=224, align=32 474 // CHECK-X64: | nvsize=64, nvalign=32] 475 476 struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 { 477 __declspec(align(32)) int a; 478 P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 479 }; 480 481 // CHECK: *** Dumping AST Record Layout 482 // CHECK: 0 | struct P 483 // CHECK: 0 | (P vbtable pointer) 484 // CHECK: 32 | int a 485 // CHECK: 64 | struct B1 (virtual base) (empty) 486 // CHECK: 64 | struct C0 (virtual base) 487 // CHECK: 64 | int a 488 // CHECK: 68 | struct D1 (virtual base) (empty) 489 // CHECK: 104 | struct B2 (virtual base) (empty) 490 // CHECK: 136 | struct B3 (virtual base) (empty) 491 // CHECK: 168 | struct B4 (virtual base) (empty) 492 // CHECK: | [sizeof=192, align=32 493 // CHECK: | nvsize=64, nvalign=32] 494 // CHECK-X64: *** Dumping AST Record Layout 495 // CHECK-X64: 0 | struct P 496 // CHECK-X64: 0 | (P vbtable pointer) 497 // CHECK-X64: 32 | int a 498 // CHECK-X64: 64 | struct B1 (virtual base) (empty) 499 // CHECK-X64: 64 | struct C0 (virtual base) 500 // CHECK-X64: 64 | int a 501 // CHECK-X64: 68 | struct D1 (virtual base) (empty) 502 // CHECK-X64: 104 | struct B2 (virtual base) (empty) 503 // CHECK-X64: 136 | struct B3 (virtual base) (empty) 504 // CHECK-X64: 168 | struct B4 (virtual base) (empty) 505 // CHECK-X64: | [sizeof=192, align=32 506 // CHECK-X64: | nvsize=64, nvalign=32] 507 508 struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 { 509 __declspec(align(32)) int a; 510 Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 511 }; 512 513 // CHECK: *** Dumping AST Record Layout 514 // CHECK: 0 | struct Q 515 // CHECK: 0 | (Q vbtable pointer) 516 // CHECK: 32 | int a 517 // CHECK: 64 | struct B1 (virtual base) (empty) 518 // CHECK: 64 | struct C0 (virtual base) 519 // CHECK: 64 | int a 520 // CHECK: 72 | struct B2 (virtual base) (empty) 521 // CHECK: 100 | struct D1 (virtual base) (empty) 522 // CHECK: 136 | struct B3 (virtual base) (empty) 523 // CHECK: 168 | struct B4 (virtual base) (empty) 524 // CHECK: | [sizeof=192, align=32 525 // CHECK: | nvsize=64, nvalign=32] 526 // CHECK-X64: *** Dumping AST Record Layout 527 // CHECK-X64: 0 | struct Q 528 // CHECK-X64: 0 | (Q vbtable pointer) 529 // CHECK-X64: 32 | int a 530 // CHECK-X64: 64 | struct B1 (virtual base) (empty) 531 // CHECK-X64: 64 | struct C0 (virtual base) 532 // CHECK-X64: 64 | int a 533 // CHECK-X64: 72 | struct B2 (virtual base) (empty) 534 // CHECK-X64: 100 | struct D1 (virtual base) (empty) 535 // CHECK-X64: 136 | struct B3 (virtual base) (empty) 536 // CHECK-X64: 168 | struct B4 (virtual base) (empty) 537 // CHECK-X64: | [sizeof=192, align=32 538 // CHECK-X64: | nvsize=64, nvalign=32] 539 540 struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 { 541 __declspec(align(32)) int a; 542 R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 543 }; 544 545 // CHECK: *** Dumping AST Record Layout 546 // CHECK: 0 | struct R 547 // CHECK: 0 | (R vbtable pointer) 548 // CHECK: 32 | int a 549 // CHECK: 64 | struct B0 (virtual base) (empty) 550 // CHECK: 72 | struct B1 (virtual base) (empty) 551 // CHECK: 104 | struct B2 (virtual base) (empty) 552 // CHECK: 104 | struct C0 (virtual base) 553 // CHECK: 104 | int a 554 // CHECK: 112 | struct B3 (virtual base) (empty) 555 // CHECK: 136 | struct B4 (virtual base) (empty) 556 // CHECK: | [sizeof=160, align=32 557 // CHECK: | nvsize=64, nvalign=32] 558 // CHECK-X64: *** Dumping AST Record Layout 559 // CHECK-X64: 0 | struct R 560 // CHECK-X64: 0 | (R vbtable pointer) 561 // CHECK-X64: 32 | int a 562 // CHECK-X64: 64 | struct B0 (virtual base) (empty) 563 // CHECK-X64: 72 | struct B1 (virtual base) (empty) 564 // CHECK-X64: 104 | struct B2 (virtual base) (empty) 565 // CHECK-X64: 104 | struct C0 (virtual base) 566 // CHECK-X64: 104 | int a 567 // CHECK-X64: 112 | struct B3 (virtual base) (empty) 568 // CHECK-X64: 136 | struct B4 (virtual base) (empty) 569 // CHECK-X64: | [sizeof=160, align=32 570 // CHECK-X64: | nvsize=64, nvalign=32] 571 572 struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 { 573 __declspec(align(32)) int a; 574 S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 575 }; 576 577 // CHECK: *** Dumping AST Record Layout 578 // CHECK: 0 | struct S 579 // CHECK: 0 | (S vbtable pointer) 580 // CHECK: 32 | int a 581 // CHECK: 64 | struct B0 (virtual base) (empty) 582 // CHECK: 72 | struct B1 (virtual base) (empty) 583 // CHECK: 72 | struct C0 (virtual base) 584 // CHECK: 72 | int a 585 // CHECK: 80 | struct B2 (virtual base) (empty) 586 // CHECK: 104 | struct B3 (virtual base) (empty) 587 // CHECK: 136 | struct B4 (virtual base) (empty) 588 // CHECK: | [sizeof=160, align=32 589 // CHECK: | nvsize=64, nvalign=32] 590 // CHECK-X64: *** Dumping AST Record Layout 591 // CHECK-X64: 0 | struct S 592 // CHECK-X64: 0 | (S vbtable pointer) 593 // CHECK-X64: 32 | int a 594 // CHECK-X64: 64 | struct B0 (virtual base) (empty) 595 // CHECK-X64: 72 | struct B1 (virtual base) (empty) 596 // CHECK-X64: 72 | struct C0 (virtual base) 597 // CHECK-X64: 72 | int a 598 // CHECK-X64: 80 | struct B2 (virtual base) (empty) 599 // CHECK-X64: 104 | struct B3 (virtual base) (empty) 600 // CHECK-X64: 136 | struct B4 (virtual base) (empty) 601 // CHECK-X64: | [sizeof=160, align=32 602 // CHECK-X64: | nvsize=64, nvalign=32] 603 604 struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 { 605 __declspec(align(16)) int a; 606 T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 607 }; 608 609 // CHECK: *** Dumping AST Record Layout 610 // CHECK: 0 | struct T 611 // CHECK: 0 | (T vbtable pointer) 612 // CHECK: 16 | int a 613 // CHECK: 32 | struct B0 (virtual base) (empty) 614 // CHECK: 40 | struct B1 (virtual base) (empty) 615 // CHECK: 40 | struct C0 (virtual base) 616 // CHECK: 40 | int a 617 // CHECK: 44 | struct D2 (virtual base) 618 // CHECK: 44 | int [8] a 619 // CHECK: 80 | struct B2 (virtual base) (empty) 620 // CHECK: 88 | struct B3 (virtual base) (empty) 621 // CHECK: 104 | struct B4 (virtual base) (empty) 622 // CHECK: | [sizeof=112, align=16 623 // CHECK: | nvsize=32, nvalign=16] 624 // CHECK-X64: *** Dumping AST Record Layout 625 // CHECK-X64: 0 | struct T 626 // CHECK-X64: 0 | (T vbtable pointer) 627 // CHECK-X64: 16 | int a 628 // CHECK-X64: 32 | struct B0 (virtual base) (empty) 629 // CHECK-X64: 40 | struct B1 (virtual base) (empty) 630 // CHECK-X64: 40 | struct C0 (virtual base) 631 // CHECK-X64: 40 | int a 632 // CHECK-X64: 44 | struct D2 (virtual base) 633 // CHECK-X64: 44 | int [8] a 634 // CHECK-X64: 80 | struct B2 (virtual base) (empty) 635 // CHECK-X64: 88 | struct B3 (virtual base) (empty) 636 // CHECK-X64: 104 | struct B4 (virtual base) (empty) 637 // CHECK-X64: | [sizeof=112, align=16 638 // CHECK-X64: | nvsize=32, nvalign=16] 639 640 struct __declspec(align(32)) U : virtual B0, virtual B1 { 641 int a; 642 U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 643 }; 644 645 // CHECK: *** Dumping AST Record Layout 646 // CHECK: 0 | struct U 647 // CHECK: 0 | (U vbtable pointer) 648 // CHECK: 4 | int a 649 // CHECK: 8 | struct B0 (virtual base) (empty) 650 // CHECK: 40 | struct B1 (virtual base) (empty) 651 // CHECK: | [sizeof=64, align=32 652 // CHECK: | nvsize=8, nvalign=4] 653 // CHECK-X64: *** Dumping AST Record Layout 654 // CHECK-X64: 0 | struct U 655 // CHECK-X64: 0 | (U vbtable pointer) 656 // CHECK-X64: 8 | int a 657 // CHECK-X64: 16 | struct B0 (virtual base) (empty) 658 // CHECK-X64: 40 | struct B1 (virtual base) (empty) 659 // CHECK-X64: | [sizeof=64, align=32 660 // CHECK-X64: | nvsize=16, nvalign=8] 661 662 struct __declspec(align(32)) V : virtual D1 { 663 int a; 664 V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} 665 }; 666 667 // CHECK: *** Dumping AST Record Layout 668 // CHECK: 0 | struct V 669 // CHECK: 0 | (V vbtable pointer) 670 // CHECK: 4 | int a 671 // CHECK: 8 | struct D1 (virtual base) (empty) 672 // CHECK: | [sizeof=32, align=32 673 // CHECK: | nvsize=8, nvalign=4] 674 // CHECK-X64: *** Dumping AST Record Layout 675 // CHECK-X64: 0 | struct V 676 // CHECK-X64: 0 | (V vbtable pointer) 677 // CHECK-X64: 8 | int a 678 // CHECK-X64: 16 | struct D1 (virtual base) (empty) 679 // CHECK-X64: | [sizeof=32, align=32 680 // CHECK-X64: | nvsize=16, nvalign=8] 681 682 int a[ 683 sizeof(A)+ 684 sizeof(B)+ 685 sizeof(C)+ 686 sizeof(D)+ 687 sizeof(E)+ 688 sizeof(F)+ 689 sizeof(G)+ 690 sizeof(H)+ 691 sizeof(I)+ 692 sizeof(J)+ 693 sizeof(K)+ 694 sizeof(L)+ 695 sizeof(M)+ 696 sizeof(N)+ 697 sizeof(O)+ 698 sizeof(P)+ 699 sizeof(Q)+ 700 sizeof(R)+ 701 sizeof(S)+ 702 sizeof(T)+ 703 sizeof(U)+ 704 sizeof(V)];