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