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