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