1 // RUN: %clang_cc1 -mconstructor-aliases %s -triple x86_64-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s
2 // RUN: %clang_cc1 -mconstructor-aliases %s -triple x86_64-windows-msvc -fms-extensions -emit-llvm -O1 -disable-llvm-passes -o - | FileCheck --check-prefix=MO1 %s
3 
4 // FIXME: We should really consider removing -mconstructor-aliases for MS C++
5 // ABI. The risk of bugs introducing ABI incompatibility under
6 // -mno-constructor-aliases is too high.
7 
8 // PR32990
9 
10 // Introduces the virtual destructor. We should use the base destructor
11 // directly, no thunk needed.
12 struct __declspec(dllimport) ImportIntroVDtor {
13   virtual ~ImportIntroVDtor() {}
14 };
15 
16 struct BaseClass {
17   virtual ~BaseClass() {}
18 };
19 
20 // Non-virtually inherits from a non-dllimport base class. We should again call
21 // the derived base constructor directly. No need for the complete (aka vbase)
22 // destructor.
23 struct __declspec(dllimport) ImportOverrideVDtor : public BaseClass {
24   virtual ~ImportOverrideVDtor() {}
25 };
26 
27 // Virtually inherits from a non-dllimport base class. Emit the vbase destructor.
28 struct __declspec(dllimport) ImportVBaseOverrideVDtor
29     : public virtual BaseClass {
30   virtual ~ImportVBaseOverrideVDtor() {}
31 };
32 
33 extern "C" void testit() {
34   ImportIntroVDtor t1;
35   ImportOverrideVDtor t2;
36   ImportVBaseOverrideVDtor t3;
37 }
38 
39 // The destructors are called in reverse order of construction. Only the third
40 // needs the complete destructor (_D).
41 // CHECK-LABEL: define void @testit()
42 // CHECK:  call void @"\01??_DImportVBaseOverrideVDtor@@QEAAXXZ"(%struct.ImportVBaseOverrideVDtor* %{{.*}})
43 // CHECK:  call void @"\01??_DImportOverrideVDtor@@QEAAXXZ"(%struct.ImportOverrideVDtor* %{{.*}})
44 // CHECK:  call void @"\01??_DImportIntroVDtor@@QEAAXXZ"(%struct.ImportIntroVDtor* %{{.*}})
45 
46 // CHECK-LABEL: declare dllimport void @"\01??_DImportVBaseOverrideVDtor@@QEAAXXZ"(%struct.ImportVBaseOverrideVDtor*)
47 // CHECK-LABEL: declare dllimport void @"\01??_DImportOverrideVDtor@@QEAAXXZ"(%struct.ImportOverrideVDtor*)
48 // CHECK-LABEL: declare dllimport void @"\01??_DImportIntroVDtor@@QEAAXXZ"(%struct.ImportIntroVDtor*)
49 
50 // MO1-DAG: define available_externally dllimport void @"\01??_DImportIntroVDtor@@QEAAXXZ"
51