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 12 namespace basic { 13 14 class A { 15 public: 16 A() { } 17 ~A(); 18 }; 19 20 void 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 31 A::~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 38 struct B { 39 B(); 40 }; 41 42 // Tests that we can define constructors outside the class (PR12784). 43 B::B() { 44 // CHECK: define x86_thiscallcc %"struct.basic::B"* @"\01??0B@basic@@QAE@XZ"(%"struct.basic::B"* returned %this) 45 // CHECK: ret 46 } 47 48 struct 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. 74 void C::foo() {} 75 76 void 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 83 void 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 95 void 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 110 void 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 126 struct 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 141 void use_D() { D c; } 142 143 } // end namespace basic 144 145 namespace dtor_in_second_nvbase { 146 147 struct A { 148 virtual void f(); // A needs vftable to be primary. 149 }; 150 struct B { 151 virtual ~B(); 152 }; 153 struct C : A, B { 154 virtual ~C(); 155 }; 156 157 C::~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 172 void 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 185 namespace 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. 189 struct A { virtual void f(); }; 190 struct B { virtual ~B(); }; 191 struct C : A, B { virtual ~C(); int c; }; 192 193 // Diamond hierarchy, with C as the shared vbase. 194 struct D : virtual C { int d; }; 195 struct E : virtual C { int e; }; 196 struct F : D, E { ~F(); int f; }; 197 198 F::~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 207 void 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 219 namespace constructors { 220 221 struct A { 222 A() {} 223 }; 224 225 struct B : A { 226 B(); 227 ~B(); 228 }; 229 230 B::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 236 struct C : virtual A { 237 C(); 238 }; 239 240 C::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 265 void 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 272 struct D : C { 273 D(); 274 }; 275 276 D::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 299 struct E : virtual C { 300 E(); 301 }; 302 303 E::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. 330 struct F { 331 F(); 332 virtual void f() = 0; 333 }; 334 335 F::F() {} 336 // CHECK: define x86_thiscallcc %"struct.constructors::F"* @"\01??0F@constructors@@QAE@XZ" 337 338 } // end namespace constructors 339 340 namespace dtors { 341 342 struct A { 343 ~A(); 344 }; 345 346 void 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 357 struct B : virtual A { ~B(); }; 358 struct C : virtual A { ~C(); }; 359 struct D : B, C { ~D(); }; 360 361 void 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 377 void 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. 387 void 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 397 namespace test1 { 398 struct A { }; 399 struct B : virtual A { 400 B(int *a); 401 B(const char *a, ...); 402 __cdecl B(short *a); 403 }; 404 B::B(int *a) {} 405 B::B(const char *a, ...) {} 406 B::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 414 void 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 426 namespace implicit_copy_vtable { 427 // This was a crash that only reproduced in ABIs without key functions. 428 struct ImplicitCopy { 429 // implicit copy ctor 430 virtual ~ImplicitCopy(); 431 }; 432 void CreateCopy(ImplicitCopy *a) { 433 new ImplicitCopy(*a); 434 } 435 // CHECK: store {{.*}} @"\01??_7ImplicitCopy@implicit_copy_vtable@@6B@" 436 437 struct MoveOnly { 438 MoveOnly(MoveOnly &&o) = default; 439 virtual ~MoveOnly(); 440 }; 441 MoveOnly &&f(); 442 void g() { new MoveOnly(f()); } 443 // CHECK: store {{.*}} @"\01??_7MoveOnly@implicit_copy_vtable@@6B@" 444 } 445 446 namespace delegating_ctor { 447 struct Y {}; 448 struct X : virtual Y { 449 X(int); 450 X(); 451 }; 452 X::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. 462 namespace { 463 struct A { 464 virtual ~A() { } 465 }; 466 } 467 void *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. 477 class 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 485 extern void testG() { 486 G g; 487 } 488