1// RUN: %clang_cc1 -emit-llvm -fno-rtti %s -std=c++11 -o - -mconstructor-aliases -triple=i386-pc-win32 -fno-rtti > %t 2// RUN: FileCheck %s < %t 3// vftables are emitted very late, so do another pass to try to keep the checks 4// in source order. 5// RUN: FileCheck --check-prefix DTORS %s < %t 6// RUN: FileCheck --check-prefix DTORS2 %s < %t 7// RUN: FileCheck --check-prefix DTORS3 %s < %t 8// RUN: FileCheck --check-prefix DTORS4 %s < %t 9// 10// RUN: %clang_cc1 -emit-llvm %s -o - -mconstructor-aliases -triple=x86_64-pc-win32 -fno-rtti -std=c++11 | FileCheck --check-prefix DTORS-X64 %s 11 12namespace basic { 13 14class A { 15 public: 16 A() { } 17 ~A(); 18}; 19 20void no_constructor_destructor_infinite_recursion() { 21 A a; 22 23// CHECK: define linkonce_odr x86_thiscallcc %"class.basic::A"* @"\01??0A@basic@@QAE@XZ"(%"class.basic::A"* returned %this) {{.*}} comdat {{.*}} { 24// CHECK: [[THIS_ADDR:%[.0-9A-Z_a-z]+]] = alloca %"class.basic::A"*, align 4 25// CHECK-NEXT: store %"class.basic::A"* %this, %"class.basic::A"** [[THIS_ADDR]], align 4 26// CHECK-NEXT: [[T1:%[.0-9A-Z_a-z]+]] = load %"class.basic::A"*, %"class.basic::A"** [[THIS_ADDR]] 27// CHECK-NEXT: ret %"class.basic::A"* [[T1]] 28// CHECK-NEXT: } 29} 30 31A::~A() { 32// Make sure that the destructor doesn't call itself: 33// CHECK: define {{.*}} @"\01??1A@basic@@QAE@XZ" 34// CHECK-NOT: call void @"\01??1A@basic@@QAE@XZ" 35// CHECK: ret 36} 37 38struct B { 39 B(); 40}; 41 42// Tests that we can define constructors outside the class (PR12784). 43B::B() { 44 // CHECK: define x86_thiscallcc %"struct.basic::B"* @"\01??0B@basic@@QAE@XZ"(%"struct.basic::B"* returned %this) 45 // CHECK: ret 46} 47 48struct C { 49 virtual ~C() { 50// DTORS: define linkonce_odr x86_thiscallcc i8* @"\01??_GC@basic@@UAEPAXI@Z"(%"struct.basic::C"* %this, i32 %should_call_delete) {{.*}} comdat {{.*}} { 51// DTORS: store i32 %should_call_delete, i32* %[[SHOULD_DELETE_VAR:[0-9a-z._]+]], align 4 52// DTORS: store i8* %{{.*}}, i8** %[[RETVAL:[0-9a-z._]+]] 53// DTORS: %[[SHOULD_DELETE_VALUE:[0-9a-z._]+]] = load i32, i32* %[[SHOULD_DELETE_VAR]] 54// DTORS: call x86_thiscallcc void @"\01??1C@basic@@UAE@XZ"(%"struct.basic::C"* %[[THIS:[0-9a-z]+]]) 55// DTORS-NEXT: %[[CONDITION:[0-9]+]] = icmp eq i32 %[[SHOULD_DELETE_VALUE]], 0 56// DTORS-NEXT: br i1 %[[CONDITION]], label %[[CONTINUE_LABEL:[0-9a-z._]+]], label %[[CALL_DELETE_LABEL:[0-9a-z._]+]] 57// 58// DTORS: [[CALL_DELETE_LABEL]] 59// DTORS-NEXT: %[[THIS_AS_VOID:[0-9a-z]+]] = bitcast %"struct.basic::C"* %[[THIS]] to i8* 60// DTORS-NEXT: call void @"\01??3@YAXPAX@Z"(i8* %[[THIS_AS_VOID]]) 61// DTORS-NEXT: br label %[[CONTINUE_LABEL]] 62// 63// DTORS: [[CONTINUE_LABEL]] 64// DTORS-NEXT: %[[RET:.*]] = load i8*, i8** %[[RETVAL]] 65// DTORS-NEXT: ret i8* %[[RET]] 66 67// Check that we do the mangling correctly on x64. 68// DTORS-X64: @"\01??_GC@basic@@UEAAPEAXI@Z" 69 } 70 virtual void foo(); 71}; 72 73// Emits the vftable in the output. 74void C::foo() {} 75 76void check_vftable_offset() { 77 C c; 78// The vftable pointer should point at the beginning of the vftable. 79// CHECK: [[THIS_PTR:%[0-9]+]] = bitcast %"struct.basic::C"* {{.*}} to i32 (...)*** 80// CHECK: store i32 (...)** bitcast ([2 x i8*]* @"\01??_7C@basic@@6B@" to i32 (...)**), i32 (...)*** [[THIS_PTR]] 81} 82 83void call_complete_dtor(C *obj_ptr) { 84// CHECK: define void @"\01?call_complete_dtor@basic@@YAXPAUC@1@@Z"(%"struct.basic::C"* %obj_ptr) 85 obj_ptr->~C(); 86// CHECK: %[[OBJ_PTR_VALUE:.*]] = load %"struct.basic::C"*, %"struct.basic::C"** %{{.*}}, align 4 87// CHECK-NEXT: %[[PVTABLE:.*]] = bitcast %"struct.basic::C"* %[[OBJ_PTR_VALUE]] to i8* (%"struct.basic::C"*, i32)*** 88// CHECK-NEXT: %[[VTABLE:.*]] = load i8* (%"struct.basic::C"*, i32)**, i8* (%"struct.basic::C"*, i32)*** %[[PVTABLE]] 89// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0 90// CHECK-NEXT: %[[VDTOR:.*]] = load i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[PVDTOR]] 91// CHECK-NEXT: call x86_thiscallcc i8* %[[VDTOR]](%"struct.basic::C"* %[[OBJ_PTR_VALUE]], i32 0) 92// CHECK-NEXT: ret void 93} 94 95void call_deleting_dtor(C *obj_ptr) { 96// CHECK: define void @"\01?call_deleting_dtor@basic@@YAXPAUC@1@@Z"(%"struct.basic::C"* %obj_ptr) 97 delete obj_ptr; 98// CHECK: %[[OBJ_PTR_VALUE:.*]] = load %"struct.basic::C"*, %"struct.basic::C"** %{{.*}}, align 4 99// CHECK: br i1 {{.*}}, label %[[DELETE_NULL:.*]], label %[[DELETE_NOTNULL:.*]] 100 101// CHECK: [[DELETE_NOTNULL]] 102// CHECK-NEXT: %[[PVTABLE:.*]] = bitcast %"struct.basic::C"* %[[OBJ_PTR_VALUE]] to i8* (%"struct.basic::C"*, i32)*** 103// CHECK-NEXT: %[[VTABLE:.*]] = load i8* (%"struct.basic::C"*, i32)**, i8* (%"struct.basic::C"*, i32)*** %[[PVTABLE]] 104// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0 105// CHECK-NEXT: %[[VDTOR:.*]] = load i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[PVDTOR]] 106// CHECK-NEXT: call x86_thiscallcc i8* %[[VDTOR]](%"struct.basic::C"* %[[OBJ_PTR_VALUE]], i32 1) 107// CHECK: ret void 108} 109 110void call_deleting_dtor_and_global_delete(C *obj_ptr) { 111// CHECK: define void @"\01?call_deleting_dtor_and_global_delete@basic@@YAXPAUC@1@@Z"(%"struct.basic::C"* %obj_ptr) 112 ::delete obj_ptr; 113// CHECK: %[[OBJ_PTR_VALUE:.*]] = load %"struct.basic::C"*, %"struct.basic::C"** %{{.*}}, align 4 114// CHECK: br i1 {{.*}}, label %[[DELETE_NULL:.*]], label %[[DELETE_NOTNULL:.*]] 115 116// CHECK: [[DELETE_NOTNULL]] 117// CHECK-NEXT: %[[PVTABLE:.*]] = bitcast %"struct.basic::C"* %[[OBJ_PTR_VALUE]] to i8* (%"struct.basic::C"*, i32)*** 118// CHECK-NEXT: %[[VTABLE:.*]] = load i8* (%"struct.basic::C"*, i32)**, i8* (%"struct.basic::C"*, i32)*** %[[PVTABLE]] 119// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0 120// CHECK-NEXT: %[[VDTOR:.*]] = load i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[PVDTOR]] 121// CHECK-NEXT: %[[CALL:.*]] = call x86_thiscallcc i8* %[[VDTOR]](%"struct.basic::C"* %[[OBJ_PTR_VALUE]], i32 0) 122// CHECK-NEXT: call void @"\01??3@YAXPAX@Z"(i8* %[[CALL]]) 123// CHECK: ret void 124} 125 126struct D { 127 static int foo(); 128 129 D() { 130 static int ctor_static = foo(); 131 // CHECK that the static in the ctor gets mangled correctly: 132 // CHECK: @"\01?ctor_static@?1???0D@basic@@QAE@XZ@4HA" 133 } 134 ~D() { 135 static int dtor_static = foo(); 136 // CHECK that the static in the dtor gets mangled correctly: 137 // CHECK: @"\01?dtor_static@?1???1D@basic@@QAE@XZ@4HA" 138 } 139}; 140 141void use_D() { D c; } 142 143} // end namespace basic 144 145namespace dtor_in_second_nvbase { 146 147struct A { 148 virtual void f(); // A needs vftable to be primary. 149}; 150struct B { 151 virtual ~B(); 152}; 153struct C : A, B { 154 virtual ~C(); 155}; 156 157C::~C() { 158// CHECK-LABEL: define x86_thiscallcc void @"\01??1C@dtor_in_second_nvbase@@UAE@XZ" 159// CHECK: (%"struct.dtor_in_second_nvbase::C"* %this) 160// No this adjustment! 161// CHECK-NOT: getelementptr 162// CHECK: load %"struct.dtor_in_second_nvbase::C"*, %"struct.dtor_in_second_nvbase::C"** %{{.*}} 163// Now we this-adjust before calling ~B. 164// CHECK: bitcast %"struct.dtor_in_second_nvbase::C"* %{{.*}} to i8* 165// CHECK: getelementptr inbounds i8, i8* %{{.*}}, i32 4 166// CHECK: bitcast i8* %{{.*}} to %"struct.dtor_in_second_nvbase::B"* 167// CHECK: call x86_thiscallcc void @"\01??1B@dtor_in_second_nvbase@@UAE@XZ" 168// CHECK: (%"struct.dtor_in_second_nvbase::B"* %{{.*}}) 169// CHECK: ret void 170} 171 172void foo() { 173 C c; 174} 175// DTORS2-LABEL: define linkonce_odr x86_thiscallcc i8* @"\01??_EC@dtor_in_second_nvbase@@W3AEPAXI@Z" 176// DTORS2: (%"struct.dtor_in_second_nvbase::C"* %this, i32 %should_call_delete) 177// Do an adjustment from B* to C*. 178// DTORS2: getelementptr i8, i8* %{{.*}}, i32 -4 179// DTORS2: bitcast i8* %{{.*}} to %"struct.dtor_in_second_nvbase::C"* 180// DTORS2: %[[CALL:.*]] = tail call x86_thiscallcc i8* @"\01??_GC@dtor_in_second_nvbase@@UAEPAXI@Z" 181// DTORS2: ret i8* %[[CALL]] 182 183} 184 185namespace test2 { 186// Just like dtor_in_second_nvbase, except put that in a vbase of a diamond. 187 188// C's dtor is in the non-primary base. 189struct A { virtual void f(); }; 190struct B { virtual ~B(); }; 191struct C : A, B { virtual ~C(); int c; }; 192 193// Diamond hierarchy, with C as the shared vbase. 194struct D : virtual C { int d; }; 195struct E : virtual C { int e; }; 196struct F : D, E { ~F(); int f; }; 197 198F::~F() { 199// CHECK-LABEL: define x86_thiscallcc void @"\01??1F@test2@@UAE@XZ"(%"struct.test2::F"*) 200// Do an adjustment from C vbase subobject to F as though F was the 201// complete type. 202// CHECK: getelementptr inbounds i8, i8* %{{.*}}, i32 -20 203// CHECK: bitcast i8* %{{.*}} to %"struct.test2::F"* 204// CHECK: store %"struct.test2::F"* 205} 206 207void foo() { 208 F f; 209} 210// DTORS3-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_DF@test2@@UAE@XZ"({{.*}} {{.*}} comdat 211// Do an adjustment from C* to F*. 212// DTORS3: getelementptr i8, i8* %{{.*}}, i32 20 213// DTORS3: bitcast i8* %{{.*}} to %"struct.test2::F"* 214// DTORS3: call x86_thiscallcc void @"\01??1F@test2@@UAE@XZ" 215// DTORS3: ret void 216 217} 218 219namespace constructors { 220 221struct A { 222 A() {} 223}; 224 225struct B : A { 226 B(); 227 ~B(); 228}; 229 230B::B() { 231 // CHECK: define x86_thiscallcc %"struct.constructors::B"* @"\01??0B@constructors@@QAE@XZ"(%"struct.constructors::B"* returned %this) 232 // CHECK: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}}) 233 // CHECK: ret 234} 235 236struct C : virtual A { 237 C(); 238}; 239 240C::C() { 241 // CHECK: define x86_thiscallcc %"struct.constructors::C"* @"\01??0C@constructors@@QAE@XZ"(%"struct.constructors::C"* returned %this, i32 %is_most_derived) 242 // TODO: make sure this works in the Release build too; 243 // CHECK: store i32 %is_most_derived, i32* %[[IS_MOST_DERIVED_VAR:.*]], align 4 244 // CHECK: %[[IS_MOST_DERIVED_VAL:.*]] = load i32, i32* %[[IS_MOST_DERIVED_VAR]] 245 // CHECK: %[[SHOULD_CALL_VBASE_CTORS:.*]] = icmp ne i32 %[[IS_MOST_DERIVED_VAL]], 0 246 // CHECK: br i1 %[[SHOULD_CALL_VBASE_CTORS]], label %[[INIT_VBASES:.*]], label %[[SKIP_VBASES:.*]] 247 // 248 // CHECK: [[INIT_VBASES]] 249 // CHECK-NEXT: %[[this_i8:.*]] = bitcast %"struct.constructors::C"* %{{.*}} to i8* 250 // CHECK-NEXT: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i32 0 251 // CHECK-NEXT: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32** 252 // CHECK-NEXT: store i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"\01??_8C@constructors@@7B@", i32 0, i32 0), i32** %[[vbptr]] 253 // CHECK-NEXT: bitcast %"struct.constructors::C"* %{{.*}} to i8* 254 // CHECK-NEXT: getelementptr inbounds i8, i8* %{{.*}}, i32 4 255 // CHECK-NEXT: bitcast i8* %{{.*}} to %"struct.constructors::A"* 256 // CHECK-NEXT: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}}) 257 // CHECK-NEXT: br label %[[SKIP_VBASES]] 258 // 259 // CHECK: [[SKIP_VBASES]] 260 // Class C does not define or override methods, so shouldn't change the vfptr. 261 // CHECK-NOT: @"\01??_7C@constructors@@6B@" 262 // CHECK: ret 263} 264 265void create_C() { 266 C c; 267 // CHECK: define void @"\01?create_C@constructors@@YAXXZ"() 268 // CHECK: call x86_thiscallcc %"struct.constructors::C"* @"\01??0C@constructors@@QAE@XZ"(%"struct.constructors::C"* %c, i32 1) 269 // CHECK: ret 270} 271 272struct D : C { 273 D(); 274}; 275 276D::D() { 277 // CHECK: define x86_thiscallcc %"struct.constructors::D"* @"\01??0D@constructors@@QAE@XZ"(%"struct.constructors::D"* returned %this, i32 %is_most_derived) unnamed_addr 278 // CHECK: store i32 %is_most_derived, i32* %[[IS_MOST_DERIVED_VAR:.*]], align 4 279 // CHECK: %[[IS_MOST_DERIVED_VAL:.*]] = load i32, i32* %[[IS_MOST_DERIVED_VAR]] 280 // CHECK: %[[SHOULD_CALL_VBASE_CTORS:.*]] = icmp ne i32 %[[IS_MOST_DERIVED_VAL]], 0 281 // CHECK: br i1 %[[SHOULD_CALL_VBASE_CTORS]], label %[[INIT_VBASES:.*]], label %[[SKIP_VBASES:.*]] 282 // 283 // CHECK: [[INIT_VBASES]] 284 // CHECK-NEXT: %[[this_i8:.*]] = bitcast %"struct.constructors::D"* %{{.*}} to i8* 285 // CHECK-NEXT: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i32 0 286 // CHECK-NEXT: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32** 287 // CHECK-NEXT: store i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"\01??_8D@constructors@@7B@", i32 0, i32 0), i32** %[[vbptr]] 288 // CHECK-NEXT: bitcast %"struct.constructors::D"* %{{.*}} to i8* 289 // CHECK-NEXT: getelementptr inbounds i8, i8* %{{.*}}, i32 4 290 // CHECK-NEXT: bitcast i8* %{{.*}} to %"struct.constructors::A"* 291 // CHECK-NEXT: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}}) 292 // CHECK-NEXT: br label %[[SKIP_VBASES]] 293 // 294 // CHECK: [[SKIP_VBASES]] 295 // CHECK: call x86_thiscallcc %"struct.constructors::C"* @"\01??0C@constructors@@QAE@XZ"(%"struct.constructors::C"* %{{.*}}, i32 0) 296 // CHECK: ret 297} 298 299struct E : virtual C { 300 E(); 301}; 302 303E::E() { 304 // CHECK: define x86_thiscallcc %"struct.constructors::E"* @"\01??0E@constructors@@QAE@XZ"(%"struct.constructors::E"* returned %this, i32 %is_most_derived) unnamed_addr 305 // CHECK: store i32 %is_most_derived, i32* %[[IS_MOST_DERIVED_VAR:.*]], align 4 306 // CHECK: %[[IS_MOST_DERIVED_VAL:.*]] = load i32, i32* %[[IS_MOST_DERIVED_VAR]] 307 // CHECK: %[[SHOULD_CALL_VBASE_CTORS:.*]] = icmp ne i32 %[[IS_MOST_DERIVED_VAL]], 0 308 // CHECK: br i1 %[[SHOULD_CALL_VBASE_CTORS]], label %[[INIT_VBASES:.*]], label %[[SKIP_VBASES:.*]] 309 // 310 // CHECK: [[INIT_VBASES]] 311 // CHECK-NEXT: %[[this_i8:.*]] = bitcast %"struct.constructors::E"* %{{.*}} to i8* 312 // CHECK-NEXT: %[[offs:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i32 0 313 // CHECK-NEXT: %[[vbptr_E:.*]] = bitcast i8* %[[offs]] to i32** 314 // CHECK-NEXT: store i32* getelementptr inbounds ([3 x i32], [3 x i32]* @"\01??_8E@constructors@@7B01@@", i32 0, i32 0), i32** %[[vbptr_E]] 315 // CHECK-NEXT: %[[offs:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i32 4 316 // CHECK-NEXT: %[[vbptr_C:.*]] = bitcast i8* %[[offs]] to i32** 317 // CHECK-NEXT: store i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"\01??_8E@constructors@@7BC@1@@", i32 0, i32 0), i32** %[[vbptr_C]] 318 // CHECK-NEXT: bitcast %"struct.constructors::E"* %{{.*}} to i8* 319 // CHECK-NEXT: getelementptr inbounds i8, i8* %{{.*}}, i32 4 320 // CHECK-NEXT: bitcast i8* %{{.*}} to %"struct.constructors::A"* 321 // CHECK-NEXT: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}}) 322 // CHECK: call x86_thiscallcc %"struct.constructors::C"* @"\01??0C@constructors@@QAE@XZ"(%"struct.constructors::C"* %{{.*}}, i32 0) 323 // CHECK-NEXT: br label %[[SKIP_VBASES]] 324 // 325 // CHECK: [[SKIP_VBASES]] 326 // CHECK: ret 327} 328 329// PR16735 - even abstract classes should have a constructor emitted. 330struct F { 331 F(); 332 virtual void f() = 0; 333}; 334 335F::F() {} 336// CHECK: define x86_thiscallcc %"struct.constructors::F"* @"\01??0F@constructors@@QAE@XZ" 337 338} // end namespace constructors 339 340namespace dtors { 341 342struct A { 343 ~A(); 344}; 345 346void call_nv_complete(A *a) { 347 a->~A(); 348// CHECK: define void @"\01?call_nv_complete@dtors@@YAXPAUA@1@@Z" 349// CHECK: call x86_thiscallcc void @"\01??1A@dtors@@QAE@XZ" 350// CHECK: ret 351} 352 353// CHECK: declare x86_thiscallcc void @"\01??1A@dtors@@QAE@XZ" 354 355// Now try some virtual bases, where we need the complete dtor. 356 357struct B : virtual A { ~B(); }; 358struct C : virtual A { ~C(); }; 359struct D : B, C { ~D(); }; 360 361void call_vbase_complete(D *d) { 362 d->~D(); 363// CHECK: define void @"\01?call_vbase_complete@dtors@@YAXPAUD@1@@Z" 364// CHECK: call x86_thiscallcc void @"\01??_DD@dtors@@QAE@XZ"(%"struct.dtors::D"* %{{[^,]+}}) 365// CHECK: ret 366} 367 368// The complete dtor should call the base dtors for D and the vbase A (once). 369// CHECK: define linkonce_odr x86_thiscallcc void @"\01??_DD@dtors@@QAE@XZ"({{.*}}) {{.*}} comdat 370// CHECK-NOT: call 371// CHECK: call x86_thiscallcc void @"\01??1D@dtors@@QAE@XZ" 372// CHECK-NOT: call 373// CHECK: call x86_thiscallcc void @"\01??1A@dtors@@QAE@XZ" 374// CHECK-NOT: call 375// CHECK: ret 376 377void destroy_d_complete() { 378 D d; 379// CHECK: define void @"\01?destroy_d_complete@dtors@@YAXXZ" 380// CHECK: call x86_thiscallcc void @"\01??_DD@dtors@@QAE@XZ"(%"struct.dtors::D"* %{{[^,]+}}) 381// CHECK: ret 382} 383 384// FIXME: Clang manually inlines the deletion, so we don't get a call to the 385// deleting dtor (_G). The only way to call deleting dtors currently is through 386// a vftable. 387void call_nv_deleting_dtor(D *d) { 388 delete d; 389// CHECK: define void @"\01?call_nv_deleting_dtor@dtors@@YAXPAUD@1@@Z" 390// CHECK: call x86_thiscallcc void @"\01??_DD@dtors@@QAE@XZ"(%"struct.dtors::D"* %{{[^,]+}}) 391// CHECK: call void @"\01??3@YAXPAX@Z" 392// CHECK: ret 393} 394 395} 396 397namespace test1 { 398struct A { }; 399struct B : virtual A { 400 B(int *a); 401 B(const char *a, ...); 402 __cdecl B(short *a); 403}; 404B::B(int *a) {} 405B::B(const char *a, ...) {} 406B::B(short *a) {} 407// CHECK: define x86_thiscallcc %"struct.test1::B"* @"\01??0B@test1@@QAE@PAH@Z" 408// CHECK: (%"struct.test1::B"* returned %this, i32* %a, i32 %is_most_derived) 409// CHECK: define %"struct.test1::B"* @"\01??0B@test1@@QAA@PBDZZ" 410// CHECK: (%"struct.test1::B"* returned %this, i32 %is_most_derived, i8* %a, ...) 411// CHECK: define x86_thiscallcc %"struct.test1::B"* @"\01??0B@test1@@QAE@PAF@Z" 412// CHECK: (%"struct.test1::B"* returned %this, i16* %a, i32 %is_most_derived) 413 414void construct_b() { 415 int a; 416 B b1(&a); 417 B b2("%d %d", 1, 2); 418} 419// CHECK-LABEL: define void @"\01?construct_b@test1@@YAXXZ"() 420// CHECK: call x86_thiscallcc %"struct.test1::B"* @"\01??0B@test1@@QAE@PAH@Z" 421// CHECK: (%"struct.test1::B"* {{.*}}, i32* {{.*}}, i32 1) 422// CHECK: call %"struct.test1::B"* (%"struct.test1::B"*, i32, i8*, ...) @"\01??0B@test1@@QAA@PBDZZ" 423// CHECK: (%"struct.test1::B"* {{.*}}, i32 1, i8* {{.*}}, i32 1, i32 2) 424} 425 426namespace implicit_copy_vtable { 427// This was a crash that only reproduced in ABIs without key functions. 428struct ImplicitCopy { 429 // implicit copy ctor 430 virtual ~ImplicitCopy(); 431}; 432void CreateCopy(ImplicitCopy *a) { 433 new ImplicitCopy(*a); 434} 435// CHECK: store {{.*}} @"\01??_7ImplicitCopy@implicit_copy_vtable@@6B@" 436 437struct MoveOnly { 438 MoveOnly(MoveOnly &&o) = default; 439 virtual ~MoveOnly(); 440}; 441MoveOnly &&f(); 442void g() { new MoveOnly(f()); } 443// CHECK: store {{.*}} @"\01??_7MoveOnly@implicit_copy_vtable@@6B@" 444} 445 446namespace delegating_ctor { 447struct Y {}; 448struct X : virtual Y { 449 X(int); 450 X(); 451}; 452X::X(int) : X() {} 453} 454// CHECK: define x86_thiscallcc %"struct.delegating_ctor::X"* @"\01??0X@delegating_ctor@@QAE@H@Z"( 455// CHECK: %[[is_most_derived_addr:.*]] = alloca i32, align 4 456// CHECK: store i32 %is_most_derived, i32* %[[is_most_derived_addr]] 457// CHECK: %[[is_most_derived:.*]] = load i32, i32* %[[is_most_derived_addr]] 458// CHECK: call x86_thiscallcc {{.*}}* @"\01??0X@delegating_ctor@@QAE@XZ"({{.*}} i32 %[[is_most_derived]]) 459 460// Dtor thunks for classes in anonymous namespaces should be internal, not 461// linkonce_odr. 462namespace { 463struct A { 464 virtual ~A() { } 465}; 466} 467void *getA() { 468 return (void*)new A(); 469} 470// CHECK: define internal x86_thiscallcc i8* @"\01??_GA@?A@@UAEPAXI@Z" 471// CHECK: (%"struct.(anonymous namespace)::A"* %this, i32 %should_call_delete) 472// CHECK: define internal x86_thiscallcc void @"\01??1A@?A@@UAE@XZ" 473// CHECK: (%"struct.(anonymous namespace)::A"* %this) 474 475// Check that we correctly transform __stdcall to __thiscall for ctors and 476// dtors. 477class G { 478 public: 479 __stdcall G() {}; 480// DTORS4: define linkonce_odr x86_thiscallcc %class.G* @"\01??0G@@QAE@XZ" 481 __stdcall ~G() {}; 482// DTORS4: define linkonce_odr x86_thiscallcc void @"\01??1G@@QAE@XZ" 483}; 484 485extern void testG() { 486 G g; 487} 488