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