1 // RUN: %clang_cc1 %s -fno-rtti -cxx-abi microsoft -triple=i386-pc-win32 -emit-llvm -o %t 2 // 3 // FIXME: These repeated FileCheck invocations are ugly, but I can't get the 4 // output in source file order. Can CHECK-DAG help here? 5 // RUN: FileCheck --check-prefix=TEST1 %s < %t 6 // RUN: FileCheck --check-prefix=TEST2 %s < %t 7 // RUN: FileCheck --check-prefix=TEST3 %s < %t 8 // RUN: FileCheck --check-prefix=TEST4 %s < %t 9 // RUN: FileCheck --check-prefix=TEST5 %s < %t 10 // RUN: FileCheck --check-prefix=TEST6 %s < %t 11 // RUN: FileCheck --check-prefix=TEST7 %s < %t 12 // RUN: FileCheck --check-prefix=TEST8 %s < %t 13 // RUN: FileCheck --check-prefix=TEST9 %s < %t 14 // RUN: FileCheck --check-prefix=TEST10 %s < %t 15 // RUN: FileCheck --check-prefix=TEST11 %s < %t 16 // RUN: FileCheck --check-prefix=TEST12 %s < %t 17 // RUN: FileCheck --check-prefix=TEST13 %s < %t 18 // RUN: FileCheck --check-prefix=TEST14 %s < %t 19 // RUN: FileCheck --check-prefix=TEST15 %s < %t 20 // RUN: FileCheck --check-prefix=TEST16 %s < %t 21 // RUN: FileCheck --check-prefix=TEST17 %s < %t 22 // RUN: FileCheck --check-prefix=TEST18 %s < %t 23 // RUN: FileCheck --check-prefix=TEST19 %s < %t 24 // RUN: FileCheck --check-prefix=TEST20 %s < %t 25 // RUN: FileCheck --check-prefix=TEST21 %s < %t 26 27 // See microsoft-abi-structors.cpp for constructor codegen tests. 28 29 namespace Test1 { 30 // Classic diamond, fully virtual. 31 struct A { int a; }; 32 struct B : virtual A { int b; }; 33 struct C : virtual A { int c; }; 34 struct D : virtual B, virtual C { int d; }; 35 D d; // Force vbtable emission. 36 37 // Layout should be: 38 // D: vbptr D 39 // int d 40 // A: int a 41 // B: vbptr B 42 // int b 43 // C: vbptr C 44 // int c 45 46 // TEST1: @"\01??_8D@Test1@@7B01@@" = linkonce_odr unnamed_addr constant [4 x i32] [i32 0, i32 8, i32 12, i32 20] 47 // TEST1: @"\01??_8D@Test1@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 -4] 48 // TEST1: @"\01??_8D@Test1@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 -12] 49 // TEST1: @"\01??_8C@Test1@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 50 // TEST1: @"\01??_8B@Test1@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 51 } 52 53 namespace Test2 { 54 // Classic diamond, only A is virtual. 55 struct A { int a; }; 56 struct B : virtual A { int b; }; 57 struct C : virtual A { int c; }; 58 struct D : B, C { int d; }; 59 D d; // Force vbtable emission. 60 61 // Layout should be: 62 // B: vbptr B 63 // int b 64 // C: vbptr C 65 // int c 66 // D: int d 67 // A: int a 68 69 // TEST2: @"\01??_8D@Test2@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 20] 70 // TEST2: @"\01??_8D@Test2@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 12] 71 // TEST2: @"\01??_8C@Test2@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 72 // TEST2: @"\01??_8B@Test2@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 73 } 74 75 namespace Test3 { 76 struct A { int a; }; 77 struct B { int b; }; 78 struct C : virtual A, virtual B { int c; }; 79 C c; 80 81 // TEST3: @"\01??_8C@Test3@@7B@" = {{.*}} [3 x i32] [i32 0, i32 8, i32 12] 82 } 83 84 namespace Test4 { 85 // Test reusing a vbptr from a non-virtual base. 86 struct A { int a; }; 87 struct B : virtual A { int b; }; 88 struct C : B, virtual A { int c; }; 89 C c; // Force vbtable emission. 90 91 // TEST4: @"\01??_8C@Test4@@7B@" = {{.*}} [2 x i32] [i32 0, i32 12] 92 // TEST4: @"\01??_8B@Test4@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 93 } 94 95 namespace Test5 { 96 // Test multiple base subobjects of the same type when that type has a virtual 97 // base. 98 struct A { int a; }; 99 struct B : virtual A { int b; }; 100 struct C : B { int c; }; 101 struct D : B, C { int d; }; 102 D d; // Force vbtable emission. 103 104 // TEST5: @"\01??_8D@Test5@@7BB@1@@" 105 // TEST5: @"\01??_8D@Test5@@7BC@1@@" 106 // TEST5: @"\01??_8C@Test5@@7B@" 107 // TEST5: @"\01??_8B@Test5@@7B@" 108 } 109 110 namespace Test6 { 111 // Test that we skip unneeded base path component names. 112 struct A { int a; }; 113 struct B : virtual A { int b; }; 114 struct C : B { int c; }; 115 struct D : B, C { int d; }; 116 struct E : D { int e; }; 117 struct F : E, B, C { int f; }; 118 struct G : F, virtual E { int g; }; 119 G g; 120 121 // TEST6: @"\01??_8G@Test6@@7BB@1@E@1@F@1@@" = 122 // TEST6: @"\01??_8G@Test6@@7BC@1@E@1@F@1@@" = 123 // TEST6: @"\01??_8G@Test6@@7BB@1@F@1@@" = 124 // TEST6: @"\01??_8G@Test6@@7BC@1@F@1@@" = 125 // TEST6: @"\01??_8G@Test6@@7BB@1@E@1@@" = 126 // TEST6: @"\01??_8G@Test6@@7BC@1@E@1@@" = 127 // TEST6: @"\01??_8F@Test6@@7BB@1@E@1@@" = {{.*}} [2 x i32] [i32 0, i32 52] 128 // TEST6: @"\01??_8F@Test6@@7BC@1@E@1@@" = {{.*}} [2 x i32] [i32 0, i32 44] 129 // TEST6: @"\01??_8F@Test6@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 24] 130 // TEST6: @"\01??_8F@Test6@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 16] 131 // TEST6: @"\01??_8C@Test6@@7B@" = {{.*}} [2 x i32] [i32 0, i32 12] 132 // TEST6: @"\01??_8B@Test6@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 133 // TEST6: @"\01??_8E@Test6@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 28] 134 // TEST6: @"\01??_8E@Test6@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 20] 135 // TEST6: @"\01??_8D@Test6@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 24] 136 // TEST6: @"\01??_8D@Test6@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 16] 137 } 138 139 namespace Test7 { 140 // Test a non-virtual base which reuses the vbptr of another base. 141 struct A { int a; }; 142 struct B { int b; }; 143 struct C { int c; }; 144 struct D : virtual A { int d; }; 145 struct E : B, D, virtual A, virtual C { int e; }; 146 E o; 147 148 // TEST7: @"\01??_8E@Test7@@7B@" = {{.*}} [3 x i32] [i32 0, i32 12, i32 16] 149 // TEST7: @"\01??_8D@Test7@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 150 } 151 152 namespace Test8 { 153 // Test a virtual base which reuses the vbptr of another base. 154 struct A { int a; }; 155 struct B : virtual A { int b; }; 156 struct C : B { int c; }; 157 struct D : virtual C { int d; }; 158 D o; 159 160 // TEST8: @"\01??_8D@Test8@@7B01@@" = {{.*}} [3 x i32] [i32 0, i32 8, i32 12] 161 // TEST8: @"\01??_8D@Test8@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 -4] 162 // TEST8: @"\01??_8C@Test8@@7B@" = {{.*}} [2 x i32] [i32 0, i32 12] 163 // TEST8: @"\01??_8B@Test8@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8] 164 } 165 166 namespace Test9 { 167 // D has to add to B's vbtable because D has more morally virtual bases than B. 168 // D then takes B's vbptr and the vbtable is named for D, not B. 169 struct A { int a; }; 170 struct B : virtual A { int b; }; 171 struct C : virtual B { int c; }; 172 struct BB : B { int bb; }; // Indirection =/ 173 struct D : BB, C { int d; }; 174 struct E : virtual D { }; 175 E e; 176 177 // TEST9: @"\01??_8E@Test9@@7B01@@" = 178 // TEST9: @"\01??_8E@Test9@@7BD@1@@" = 179 // TEST9: @"\01??_8E@Test9@@7BC@1@@" = 180 // TEST9: @"\01??_8E@Test9@@7BB@1@@" = 181 // TEST9: @"\01??_8D@Test9@@7B@" = 182 // TEST9: @"\01??_8D@Test9@@7BC@1@@" = 183 // TEST9: @"\01??_8D@Test9@@7BB@1@@" = 184 // TEST9: @"\01??_8C@Test9@@7B01@@" = 185 // TEST9: @"\01??_8C@Test9@@7BB@1@@" = 186 // TEST9: @"\01??_8BB@Test9@@7B@" = 187 // TEST9: @"\01??_8B@Test9@@7B@" = 188 } 189 190 namespace Test10 { 191 struct A { int a; }; 192 struct B { int b; }; 193 struct C : virtual A { int c; }; 194 struct D : B, C { int d; }; 195 D d; 196 197 // TEST10: @"\01??_8D@Test10@@7B@" = 198 // TEST10: @"\01??_8C@Test10@@7B@" = 199 200 } 201 202 namespace Test11 { 203 // Typical diamond with an extra single inheritance indirection for B and C. 204 struct A { int a; }; 205 struct B : virtual A { int b; }; 206 struct C : virtual A { int c; }; 207 struct D : B { int d; }; 208 struct E : C { int e; }; 209 struct F : D, E { int f; }; 210 F f; 211 212 // TEST11: @"\01??_8F@Test11@@7BD@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 28] 213 // TEST11: @"\01??_8F@Test11@@7BE@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 16] 214 // TEST11: @"\01??_8E@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 12] 215 // TEST11: @"\01??_8C@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] 216 // TEST11: @"\01??_8D@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 12] 217 // TEST11: @"\01??_8B@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] 218 219 } 220 221 namespace Test12 { 222 // Another vbptr inside a virtual base. 223 struct A { int a; }; 224 struct B : virtual A { int b; }; 225 struct C : virtual B { int c; }; 226 struct D : C, B { int d; }; 227 struct E : D, C, B { int e; }; 228 E e; 229 230 // TEST12: @"\01??_8E@Test12@@7BC@1@D@1@@" = 231 // TEST12: @"\01??_8E@Test12@@7BB@1@D@1@@" = 232 // TEST12: @"\01??_8E@Test12@@7BD@1@@" = 233 // TEST12: @"\01??_8E@Test12@@7BC@1@@" = 234 // TEST12: @"\01??_8E@Test12@@7BB@1@@" = 235 // TEST12: @"\01??_8C@Test12@@7B01@@" = 236 // TEST12: @"\01??_8C@Test12@@7BB@1@@" = 237 // TEST12: @"\01??_8D@Test12@@7BC@1@@" = 238 // TEST12: @"\01??_8D@Test12@@7BB@1@@" = 239 // TEST12: @"\01??_8D@Test12@@7B@" = 240 // TEST12: @"\01??_8B@Test12@@7B@" = 241 } 242 243 namespace Test13 { 244 struct A { int a; }; 245 struct B : virtual A { int b; }; 246 struct C : virtual B { int c; }; 247 struct D : virtual C { int d; }; 248 struct E : D, C, B { int e; }; 249 E e; 250 251 // TEST13: @"\01??_8E@Test13@@7BD@1@@" = 252 // TEST13: @"\01??_8E@Test13@@7BC@1@D@1@@" = 253 // TEST13: @"\01??_8E@Test13@@7BB@1@D@1@@" = 254 // TEST13: @"\01??_8E@Test13@@7BC@1@@" = 255 // TEST13: @"\01??_8E@Test13@@7BB@1@@" = 256 // TEST13: @"\01??_8D@Test13@@7B@" = 257 // TEST13: @"\01??_8D@Test13@@7BC@1@@" = 258 // TEST13: @"\01??_8D@Test13@@7BB@1@@" = 259 // TEST13: @"\01??_8C@Test13@@7B01@@" = 260 // TEST13: @"\01??_8C@Test13@@7BB@1@@" = 261 // TEST13: @"\01??_8B@Test13@@7B@" = 262 } 263 264 namespace Test14 { 265 struct A { int a; }; 266 struct B : virtual A { int b; }; 267 struct C : virtual B { int c; }; 268 struct D : virtual C { int d; }; 269 struct E : D, virtual C, virtual B { int e; }; 270 E e; 271 272 // TEST14: @"\01??_8E@Test14@@7B@" = 273 // TEST14: @"\01??_8E@Test14@@7BC@1@@" = 274 // TEST14: @"\01??_8E@Test14@@7BB@1@@" = 275 // TEST14: @"\01??_8D@Test14@@7B@" = 276 // TEST14: @"\01??_8D@Test14@@7BC@1@@" = 277 // TEST14: @"\01??_8D@Test14@@7BB@1@@" = 278 // TEST14: @"\01??_8C@Test14@@7B01@@" = 279 // TEST14: @"\01??_8C@Test14@@7BB@1@@" = 280 // TEST14: @"\01??_8B@Test14@@7B@" = 281 } 282 283 namespace Test15 { 284 struct A { int a; }; 285 struct B : virtual A { int b; }; 286 struct C : virtual A { int c; }; 287 struct D : virtual B { int d; }; 288 struct E : D, C, B { int e; }; 289 E e; 290 291 // TEST15: @"\01??_8E@Test15@@7BD@1@@" = 292 // TEST15: @"\01??_8E@Test15@@7BB@1@D@1@@" = 293 // TEST15: @"\01??_8E@Test15@@7BC@1@@" = 294 // TEST15: @"\01??_8E@Test15@@7BB@1@@" = 295 // TEST15: @"\01??_8C@Test15@@7B@" = 296 // TEST15: @"\01??_8D@Test15@@7B01@@" = 297 // TEST15: @"\01??_8D@Test15@@7BB@1@@" = 298 // TEST15: @"\01??_8B@Test15@@7B@" = 299 } 300 301 namespace Test16 { 302 struct A { int a; }; 303 struct B : virtual A { int b; }; 304 struct C : virtual B { int c; }; // ambig 305 struct D : virtual C { int d; }; 306 struct E : virtual D { int e; }; // ambig 307 struct F : E, D, C, B { int f; }; // ambig 308 F f; 309 310 // TEST16: @"\01??_8F@Test16@@7BE@1@@" = 311 // TEST16: @"\01??_8F@Test16@@7BD@1@E@1@@" = 312 // TEST16: @"\01??_8F@Test16@@7BC@1@E@1@@" = 313 // TEST16: @"\01??_8F@Test16@@7BB@1@E@1@@" = 314 // TEST16: @"\01??_8F@Test16@@7BD@1@@" = 315 // TEST16: @"\01??_8F@Test16@@7BC@1@@" = 316 // TEST16: @"\01??_8F@Test16@@7BB@1@@" = 317 // TEST16: @"\01??_8E@Test16@@7B01@@" = 318 // TEST16: @"\01??_8E@Test16@@7BD@1@@" = 319 // TEST16: @"\01??_8E@Test16@@7BC@1@@" = 320 // TEST16: @"\01??_8E@Test16@@7BB@1@@" = 321 // TEST16: @"\01??_8D@Test16@@7B@" = 322 // TEST16: @"\01??_8D@Test16@@7BC@1@@" = 323 // TEST16: @"\01??_8D@Test16@@7BB@1@@" = 324 // TEST16: @"\01??_8C@Test16@@7B01@@" = 325 // TEST16: @"\01??_8C@Test16@@7BB@1@@" = 326 // TEST16: @"\01??_8B@Test16@@7B@" = 327 } 328 329 namespace Test17 { 330 // This test case has an interesting alternating pattern of using "vbtable of B" 331 // and "vbtable of C for C". This may be the key to the underlying algorithm. 332 struct A { int a; }; 333 struct B : virtual A { int b; }; 334 struct C : virtual B { int c; }; // ambig 335 struct D : virtual C { int d; }; 336 struct E : virtual D { int e; }; // ambig 337 struct F : virtual E { int f; }; 338 struct G : virtual F { int g; }; // ambig 339 struct H : virtual G { int h; }; 340 struct I : virtual H { int i; }; // ambig 341 struct J : virtual I { int j; }; 342 struct K : virtual J { int k; }; // ambig 343 K k; 344 345 // TEST17: @"\01??_8K@Test17@@7B01@@" = 346 // TEST17: @"\01??_8J@Test17@@7B@" = 347 // TEST17: @"\01??_8I@Test17@@7B01@@" = 348 // TEST17: @"\01??_8H@Test17@@7B@" = 349 // TEST17: @"\01??_8G@Test17@@7B01@@" = 350 // TEST17: @"\01??_8F@Test17@@7B@" = 351 // TEST17: @"\01??_8E@Test17@@7B01@@" = 352 // TEST17: @"\01??_8D@Test17@@7B@" = 353 // TEST17: @"\01??_8C@Test17@@7B01@@" = 354 // TEST17: @"\01??_8B@Test17@@7B@" = 355 } 356 357 namespace Test18 { 358 struct A { int a; }; 359 struct B : virtual A { int b; }; 360 struct C : B { int c; }; 361 struct D : C, B { int d; }; 362 struct E : D, C, B { int e; }; 363 E e; 364 365 // TEST18: @"\01??_8E@Test18@@7BC@1@D@1@@" = 366 // TEST18: @"\01??_8E@Test18@@7BB@1@D@1@@" = 367 // TEST18: @"\01??_8E@Test18@@7BC@1@@" = 368 // TEST18: @"\01??_8E@Test18@@7BB@1@@" = 369 // TEST18: @"\01??_8B@Test18@@7B@" = 370 // TEST18: @"\01??_8C@Test18@@7B@" = 371 // TEST18: @"\01??_8D@Test18@@7BC@1@@" = 372 // TEST18: @"\01??_8D@Test18@@7BB@1@@" = 373 } 374 375 namespace Test19 { 376 struct A { int a; }; 377 struct B : virtual A { int b; }; 378 struct C : virtual B { int c; }; 379 struct D : virtual C, virtual B { int d; }; 380 struct E : virtual D, virtual C, virtual B { int e; }; 381 E e; 382 383 // TEST19: @"\01??_8E@Test19@@7B01@@" = 384 // TEST19: @"\01??_8E@Test19@@7BD@1@@" = 385 // TEST19: @"\01??_8E@Test19@@7BC@1@@" = 386 // TEST19: @"\01??_8E@Test19@@7BB@1@@" = 387 // TEST19: @"\01??_8D@Test19@@7B@" = 388 // TEST19: @"\01??_8D@Test19@@7BC@1@@" = 389 // TEST19: @"\01??_8D@Test19@@7BB@1@@" = 390 // TEST19: @"\01??_8C@Test19@@7B01@@" = 391 // TEST19: @"\01??_8C@Test19@@7BB@1@@" = 392 // TEST19: @"\01??_8B@Test19@@7B@" = 393 } 394 395 namespace Test20 { 396 // E has no direct vbases, but it adds to C's vbtable anyway. 397 struct A { int a; }; 398 struct B { int b; }; 399 struct C : virtual A { int c; }; 400 struct D : virtual B { int d; }; 401 struct E : C, D { int e; }; 402 E f; 403 404 // TEST20: @"\01??_8E@Test20@@7BC@1@@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 0, i32 20, i32 24] 405 // TEST20: @"\01??_8E@Test20@@7BD@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 16] 406 // TEST20: @"\01??_8D@Test20@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] 407 // TEST20: @"\01??_8C@Test20@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] 408 } 409 410 namespace Test21 { 411 struct A { int a; }; 412 struct B : virtual A { int b; }; 413 struct C : B { int c; }; 414 struct D : B { int d; }; 415 struct E : C, D { int e; }; 416 struct F : virtual E { int f; }; 417 struct G : E { int g; }; 418 struct H : F, G { int h; }; 419 H h; 420 421 // TEST21: @"\01??_8H@Test21@@7B@" = 422 // TEST21: @"\01??_8H@Test21@@7BC@1@F@1@@" = 423 // TEST21: @"\01??_8H@Test21@@7BD@1@F@1@@" = 424 // TEST21: @"\01??_8H@Test21@@7BC@1@G@1@@" = 425 // TEST21: @"\01??_8H@Test21@@7BD@1@G@1@@" = 426 // TEST21: @"\01??_8G@Test21@@7BC@1@@" = 427 // TEST21: @"\01??_8G@Test21@@7BD@1@@" = 428 // TEST21: @"\01??_8F@Test21@@7B@" = 429 // TEST21: @"\01??_8F@Test21@@7BC@1@@" = 430 // TEST21: @"\01??_8F@Test21@@7BD@1@@" = 431 // TEST21: @"\01??_8E@Test21@@7BC@1@@" = 432 // TEST21: @"\01??_8E@Test21@@7BD@1@@" = 433 // TEST21: @"\01??_8D@Test21@@7B@" = 434 // TEST21: @"\01??_8B@Test21@@7B@" = 435 // TEST21: @"\01??_8C@Test21@@7B@" = 436 } 437