1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \ 2 // RUN: | FileCheck %s 3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \ 4 // RUN: | FileCheck %s -check-prefix CHECK-X64 5 6 extern "C" int printf(const char *fmt, ...); 7 8 struct B0 { int a; B0() : a(0xf00000B0) {} }; 9 struct B1 { char a; B1() : a(0xB1) {} }; 10 struct B2 : virtual B1 { int a; B2() : a(0xf00000B2) {} }; 11 struct B3 { __declspec(align(16)) int a; B3() : a(0xf00000B3) {} }; 12 struct B4 : virtual B3 { int a; B4() : a(0xf00000B4) {} }; 13 struct B5 { __declspec(align(32)) int a; B5() : a(0xf00000B5) {} }; 14 struct B6 { int a; B6() : a(0xf00000B6) {} virtual void f() { printf("B6"); } }; 15 16 struct A : B0, virtual B1 { __declspec(align(16)) int a; A() : a(0xf000000A) {} virtual void f() { printf("A"); } }; 17 18 // CHECK: *** Dumping AST Record Layout 19 // CHECK: 0 | struct A 20 // CHECK: 0 | (A vftable pointer) 21 // CHECK: 16 | struct B0 (base) 22 // CHECK: 16 | int a 23 // CHECK: 20 | (A vbtable pointer) 24 // CHECK: 48 | int a 25 // CHECK: 64 | struct B1 (virtual base) 26 // CHECK: 64 | char a 27 // CHECK: | [sizeof=80, align=16 28 // CHECK: | nvsize=64, nvalign=16] 29 // CHECK-X64: *** Dumping AST Record Layout 30 // CHECK-X64: 0 | struct A 31 // CHECK-X64: 0 | (A vftable pointer) 32 // CHECK-X64: 8 | struct B0 (base) 33 // CHECK-X64: 8 | int a 34 // CHECK-X64: 16 | (A vbtable pointer) 35 // CHECK-X64: 32 | int a 36 // CHECK-X64: 48 | struct B1 (virtual base) 37 // CHECK-X64: 48 | char a 38 // CHECK-X64: | [sizeof=64, align=16 39 // CHECK-X64: | nvsize=48, nvalign=16] 40 41 struct B : A, B2 { int a; B() : a(0xf000000B) {} virtual void f() { printf("B"); } }; 42 43 // CHECK: *** Dumping AST Record Layout 44 // CHECK: 0 | struct B 45 // CHECK: 0 | struct A (primary base) 46 // CHECK: 0 | (A vftable pointer) 47 // CHECK: 16 | struct B0 (base) 48 // CHECK: 16 | int a 49 // CHECK: 20 | (A vbtable pointer) 50 // CHECK: 48 | int a 51 // CHECK: 64 | struct B2 (base) 52 // CHECK: 64 | (B2 vbtable pointer) 53 // CHECK: 68 | int a 54 // CHECK: 72 | int a 55 // CHECK: 80 | struct B1 (virtual base) 56 // CHECK: 80 | char a 57 // CHECK: | [sizeof=96, align=16 58 // CHECK: | nvsize=80, nvalign=16] 59 // CHECK-X64: *** Dumping AST Record Layout 60 // CHECK-X64: 0 | struct B 61 // CHECK-X64: 0 | struct A (primary base) 62 // CHECK-X64: 0 | (A vftable pointer) 63 // CHECK-X64: 8 | struct B0 (base) 64 // CHECK-X64: 8 | int a 65 // CHECK-X64: 16 | (A vbtable pointer) 66 // CHECK-X64: 32 | int a 67 // CHECK-X64: 48 | struct B2 (base) 68 // CHECK-X64: 48 | (B2 vbtable pointer) 69 // CHECK-X64: 56 | int a 70 // CHECK-X64: 64 | int a 71 // CHECK-X64: 80 | struct B1 (virtual base) 72 // CHECK-X64: 80 | char a 73 // CHECK-X64: | [sizeof=96, align=16 74 // CHECK-X64: | nvsize=80, nvalign=16] 75 76 struct C : B4 { int a; C() : a(0xf000000C) {} virtual void f() { printf("C"); } }; 77 78 // CHECK: *** Dumping AST Record Layout 79 // CHECK: 0 | struct C 80 // CHECK: 0 | (C vftable pointer) 81 // CHECK: 16 | struct B4 (base) 82 // CHECK: 16 | (B4 vbtable pointer) 83 // CHECK: 20 | int a 84 // CHECK: 24 | int a 85 // CHECK: 32 | struct B3 (virtual base) 86 // CHECK: 32 | int a 87 // CHECK: | [sizeof=48, align=16 88 // CHECK: | nvsize=32, nvalign=16] 89 // CHECK-X64: *** Dumping AST Record Layout 90 // CHECK-X64: 0 | struct C 91 // CHECK-X64: 0 | (C vftable pointer) 92 // CHECK-X64: 16 | struct B4 (base) 93 // CHECK-X64: 16 | (B4 vbtable pointer) 94 // CHECK-X64: 24 | int a 95 // CHECK-X64: 32 | int a 96 // CHECK-X64: 48 | struct B3 (virtual base) 97 // CHECK-X64: 48 | int a 98 // CHECK-X64: | [sizeof=64, align=16 99 // CHECK-X64: | nvsize=48, nvalign=16] 100 101 struct D : C { int a; D() : a(0xf000000D) {} virtual void f() { printf("D"); } }; 102 103 // CHECK: *** Dumping AST Record Layout 104 // CHECK: 0 | struct D 105 // CHECK: 0 | struct C (primary base) 106 // CHECK: 0 | (C vftable pointer) 107 // CHECK: 16 | struct B4 (base) 108 // CHECK: 16 | (B4 vbtable pointer) 109 // CHECK: 20 | int a 110 // CHECK: 24 | int a 111 // CHECK: 32 | int a 112 // CHECK: 48 | struct B3 (virtual base) 113 // CHECK: 48 | int a 114 // CHECK: | [sizeof=64, align=16 115 // CHECK: | nvsize=48, nvalign=16] 116 // CHECK-X64: *** Dumping AST Record Layout 117 // CHECK-X64: 0 | struct D 118 // CHECK-X64: 0 | struct C (primary base) 119 // CHECK-X64: 0 | (C vftable pointer) 120 // CHECK-X64: 16 | struct B4 (base) 121 // CHECK-X64: 16 | (B4 vbtable pointer) 122 // CHECK-X64: 24 | int a 123 // CHECK-X64: 32 | int a 124 // CHECK-X64: 48 | int a 125 // CHECK-X64: 64 | struct B3 (virtual base) 126 // CHECK-X64: 64 | int a 127 // CHECK-X64: | [sizeof=80, align=16 128 // CHECK-X64: | nvsize=64, nvalign=16] 129 130 struct E : virtual C { int a; E() : a(0xf000000E) {} virtual void f() { printf("E"); } }; 131 132 // CHECK: *** Dumping AST Record Layout 133 // CHECK: 0 | struct E 134 // CHECK: 0 | (E vbtable pointer) 135 // CHECK: 4 | int a 136 // CHECK: 16 | struct B3 (virtual base) 137 // CHECK: 16 | int a 138 // CHECK: 44 | (vtordisp for vbase C) 139 // CHECK: 48 | struct C (virtual base) 140 // CHECK: 48 | (C vftable pointer) 141 // CHECK: 64 | struct B4 (base) 142 // CHECK: 64 | (B4 vbtable pointer) 143 // CHECK: 68 | int a 144 // CHECK: 72 | int a 145 // CHECK: | [sizeof=80, align=16 146 // CHECK: | nvsize=8, nvalign=4] 147 // CHECK-X64: *** Dumping AST Record Layout 148 // CHECK-X64: 0 | struct E 149 // CHECK-X64: 0 | (E vbtable pointer) 150 // CHECK-X64: 8 | int a 151 // CHECK-X64: 16 | struct B3 (virtual base) 152 // CHECK-X64: 16 | int a 153 // CHECK-X64: 44 | (vtordisp for vbase C) 154 // CHECK-X64: 48 | struct C (virtual base) 155 // CHECK-X64: 48 | (C vftable pointer) 156 // CHECK-X64: 64 | struct B4 (base) 157 // CHECK-X64: 64 | (B4 vbtable pointer) 158 // CHECK-X64: 72 | int a 159 // CHECK-X64: 80 | int a 160 // CHECK-X64: | [sizeof=96, align=16 161 // CHECK-X64: | nvsize=16, nvalign=8] 162 163 struct F : B3, virtual B0 { int a; F() : a(0xf000000F) {} virtual void f() { printf("F"); } }; 164 165 // CHECK: *** Dumping AST Record Layout 166 // CHECK: 0 | struct F 167 // CHECK: 0 | (F vftable pointer) 168 // CHECK: 16 | struct B3 (base) 169 // CHECK: 16 | int a 170 // CHECK: 32 | (F vbtable pointer) 171 // CHECK: 48 | int a 172 // CHECK: 64 | struct B0 (virtual base) 173 // CHECK: 64 | int a 174 // CHECK: | [sizeof=80, align=16 175 // CHECK: | nvsize=64, nvalign=16] 176 // CHECK-X64: *** Dumping AST Record Layout 177 // CHECK-X64: 0 | struct F 178 // CHECK-X64: 0 | (F vftable pointer) 179 // CHECK-X64: 16 | struct B3 (base) 180 // CHECK-X64: 16 | int a 181 // CHECK-X64: 32 | (F vbtable pointer) 182 // CHECK-X64: 40 | int a 183 // CHECK-X64: 48 | struct B0 (virtual base) 184 // CHECK-X64: 48 | int a 185 // CHECK-X64: | [sizeof=64, align=16 186 // CHECK-X64: | nvsize=48, nvalign=16] 187 188 struct G : B2, B6, virtual B1 { int a; G() : a(0xf0000010) {} }; 189 190 // CHECK: *** Dumping AST Record Layout 191 // CHECK: 0 | struct G 192 // CHECK: 8 | struct B2 (base) 193 // CHECK: 8 | (B2 vbtable pointer) 194 // CHECK: 12 | int a 195 // CHECK: 0 | struct B6 (primary base) 196 // CHECK: 0 | (B6 vftable pointer) 197 // CHECK: 4 | int a 198 // CHECK: 16 | int a 199 // CHECK: 20 | struct B1 (virtual base) 200 // CHECK: 20 | char a 201 // CHECK: | [sizeof=21, align=4 202 // CHECK: | nvsize=20, nvalign=4] 203 // CHECK-X64: *** Dumping AST Record Layout 204 // CHECK-X64: 0 | struct G 205 // CHECK-X64: 16 | struct B2 (base) 206 // CHECK-X64: 16 | (B2 vbtable pointer) 207 // CHECK-X64: 24 | int a 208 // CHECK-X64: 0 | struct B6 (primary base) 209 // CHECK-X64: 0 | (B6 vftable pointer) 210 // CHECK-X64: 8 | int a 211 // CHECK-X64: 32 | int a 212 // CHECK-X64: 40 | struct B1 (virtual base) 213 // CHECK-X64: 40 | char a 214 // CHECK-X64: | [sizeof=48, align=8 215 // CHECK-X64: | nvsize=40, nvalign=8] 216 217 struct H : B6, B2, virtual B1 { int a; H() : a(0xf0000011) {} }; 218 219 // CHECK: *** Dumping AST Record Layout 220 // CHECK: 0 | struct H 221 // CHECK: 0 | struct B6 (primary base) 222 // CHECK: 0 | (B6 vftable pointer) 223 // CHECK: 4 | int a 224 // CHECK: 8 | struct B2 (base) 225 // CHECK: 8 | (B2 vbtable pointer) 226 // CHECK: 12 | int a 227 // CHECK: 16 | int a 228 // CHECK: 20 | struct B1 (virtual base) 229 // CHECK: 20 | char a 230 // CHECK: | [sizeof=21, align=4 231 // CHECK: | nvsize=20, nvalign=4] 232 // CHECK-X64: *** Dumping AST Record Layout 233 // CHECK-X64: 0 | struct H 234 // CHECK-X64: 0 | struct B6 (primary base) 235 // CHECK-X64: 0 | (B6 vftable pointer) 236 // CHECK-X64: 8 | int a 237 // CHECK-X64: 16 | struct B2 (base) 238 // CHECK-X64: 16 | (B2 vbtable pointer) 239 // CHECK-X64: 24 | int a 240 // CHECK-X64: 32 | int a 241 // CHECK-X64: 40 | struct B1 (virtual base) 242 // CHECK-X64: 40 | char a 243 // CHECK-X64: | [sizeof=48, align=8 244 // CHECK-X64: | nvsize=40, nvalign=8] 245 246 struct I : B0, virtual B1 { int a; int a1; __declspec(align(16)) int a2; I() : a(0xf0000011), a1(0xf0000011), a2(0xf0000011) {} }; 247 248 // CHECK: *** Dumping AST Record Layout 249 // CHECK: 0 | struct I 250 // CHECK: 0 | struct B0 (base) 251 // CHECK: 0 | int a 252 // CHECK: 4 | (I vbtable pointer) 253 // CHECK: 20 | int a 254 // CHECK: 24 | int a1 255 // CHECK: 32 | int a2 256 // CHECK: 48 | struct B1 (virtual base) 257 // CHECK: 48 | char a 258 // CHECK: | [sizeof=64, align=16 259 // CHECK: | nvsize=48, nvalign=16] 260 // CHECK-X64: *** Dumping AST Record Layout 261 // CHECK-X64: 0 | struct I 262 // CHECK-X64: 0 | struct B0 (base) 263 // CHECK-X64: 0 | int a 264 // CHECK-X64: 8 | (I vbtable pointer) 265 // CHECK-X64: 16 | int a 266 // CHECK-X64: 20 | int a1 267 // CHECK-X64: 32 | int a2 268 // CHECK-X64: 48 | struct B1 (virtual base) 269 // CHECK-X64: 48 | char a 270 // CHECK-X64: | [sizeof=64, align=16 271 // CHECK-X64: | nvsize=48, nvalign=16] 272 273 struct J : B0, B3, virtual B1 { int a; int a1; J() : a(0xf0000012), a1(0xf0000012) {} }; 274 275 // CHECK: *** Dumping AST Record Layout 276 // CHECK: 0 | struct J 277 // CHECK: 0 | struct B0 (base) 278 // CHECK: 0 | int a 279 // CHECK: 16 | struct B3 (base) 280 // CHECK: 16 | int a 281 // CHECK: 32 | (J vbtable pointer) 282 // CHECK: 48 | int a 283 // CHECK: 52 | int a1 284 // CHECK: 64 | struct B1 (virtual base) 285 // CHECK: 64 | char a 286 // CHECK: | [sizeof=80, align=16 287 // CHECK: | nvsize=64, nvalign=16] 288 // CHECK-X64: *** Dumping AST Record Layout 289 // CHECK-X64: 0 | struct J 290 // CHECK-X64: 0 | struct B0 (base) 291 // CHECK-X64: 0 | int a 292 // CHECK-X64: 16 | struct B3 (base) 293 // CHECK-X64: 16 | int a 294 // CHECK-X64: 32 | (J vbtable pointer) 295 // CHECK-X64: 40 | int a 296 // CHECK-X64: 44 | int a1 297 // CHECK-X64: 48 | struct B1 (virtual base) 298 // CHECK-X64: 48 | char a 299 // CHECK-X64: | [sizeof=64, align=16 300 // CHECK-X64: | nvsize=48, nvalign=16] 301 302 struct K { int a; K() : a(0xf0000013) {} virtual void f() { printf("K"); } }; 303 304 // CHECK: *** Dumping AST Record Layout 305 // CHECK: 0 | struct K 306 // CHECK: 0 | (K vftable pointer) 307 // CHECK: 4 | int a 308 // CHECK: | [sizeof=8, align=4 309 // CHECK: | nvsize=8, nvalign=4] 310 // CHECK-X64: *** Dumping AST Record Layout 311 // CHECK-X64: 0 | struct K 312 // CHECK-X64: 0 | (K vftable pointer) 313 // CHECK-X64: 8 | int a 314 // CHECK-X64: | [sizeof=16, align=8 315 // CHECK-X64: | nvsize=16, nvalign=8] 316 317 struct L : virtual K { int a; L() : a(0xf0000014) {} virtual void g() { printf("L"); } }; 318 319 // CHECK: *** Dumping AST Record Layout 320 // CHECK: 0 | struct L 321 // CHECK: 0 | (L vftable pointer) 322 // CHECK: 4 | (L vbtable pointer) 323 // CHECK: 8 | int a 324 // CHECK: 12 | struct K (virtual base) 325 // CHECK: 12 | (K vftable pointer) 326 // CHECK: 16 | int a 327 // CHECK: | [sizeof=20, align=4 328 // CHECK: | nvsize=12, nvalign=4] 329 // CHECK-X64: *** Dumping AST Record Layout 330 // CHECK-X64: 0 | struct L 331 // CHECK-X64: 0 | (L vftable pointer) 332 // CHECK-X64: 8 | (L vbtable pointer) 333 // CHECK-X64: 16 | int a 334 // CHECK-X64: 24 | struct K (virtual base) 335 // CHECK-X64: 24 | (K vftable pointer) 336 // CHECK-X64: 32 | int a 337 // CHECK-X64: | [sizeof=40, align=8 338 // CHECK-X64: | nvsize=24, nvalign=8] 339 340 struct M : virtual K { int a; M() : a(0xf0000015) {} virtual void f() { printf("M"); } }; 341 342 // CHECK: *** Dumping AST Record Layout 343 // CHECK: 0 | struct M 344 // CHECK: 0 | (M vbtable pointer) 345 // CHECK: 4 | int a 346 // CHECK: 8 | (vtordisp for vbase K) 347 // CHECK: 12 | struct K (virtual base) 348 // CHECK: 12 | (K vftable pointer) 349 // CHECK: 16 | int a 350 // CHECK: | [sizeof=20, align=4 351 // CHECK: | nvsize=8, nvalign=4] 352 // CHECK-X64: *** Dumping AST Record Layout 353 // CHECK-X64: 0 | struct M 354 // CHECK-X64: 0 | (M vbtable pointer) 355 // CHECK-X64: 8 | int a 356 // CHECK-X64: 20 | (vtordisp for vbase K) 357 // CHECK-X64: 24 | struct K (virtual base) 358 // CHECK-X64: 24 | (K vftable pointer) 359 // CHECK-X64: 32 | int a 360 // CHECK-X64: | [sizeof=40, align=8 361 // CHECK-X64: | nvsize=16, nvalign=8] 362 363 int a[ 364 sizeof(A)+ 365 sizeof(B)+ 366 sizeof(C)+ 367 sizeof(D)+ 368 sizeof(E)+ 369 sizeof(F)+ 370 sizeof(G)+ 371 sizeof(H)+ 372 sizeof(I)+ 373 sizeof(J)+ 374 sizeof(K)+ 375 sizeof(L)+ 376 sizeof(M)]; 377