46 lines · cpp
1// RUN: %clang_cc1 -mconstructor-aliases %s -triple x86_64-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s2 3// PR329904 5// Introduces the virtual destructor. We should use the base destructor6// directly, no thunk needed.7struct __declspec(dllimport) ImportIntroVDtor {8 virtual ~ImportIntroVDtor() {}9};10 11struct BaseClass {12 virtual ~BaseClass() {}13};14 15// Non-virtually inherits from a non-dllimport base class. We should again call16// the derived base constructor directly. No need for the complete (aka vbase)17// destructor.18struct __declspec(dllimport) ImportOverrideVDtor : public BaseClass {19 virtual ~ImportOverrideVDtor() {}20};21 22// Virtually inherits from a non-dllimport base class. In this case, we can23// expect the DLL to provide a definition of the complete dtor. See24// dllexport-dtor-thunks.cpp.25struct __declspec(dllimport) ImportVBaseOverrideVDtor26 : public virtual BaseClass {27 virtual ~ImportVBaseOverrideVDtor() {}28};29 30extern "C" void testit() {31 ImportIntroVDtor t1;32 ImportOverrideVDtor t2;33 ImportVBaseOverrideVDtor t3;34}35 36// The destructors are called in reverse order of construction. Only the third37// needs the complete destructor (_D).38// CHECK-LABEL: define dso_local void @testit()39// CHECK: call void @"??_DImportVBaseOverrideVDtor@@QEAAXXZ"(ptr {{[^,]*}} %{{.*}})40// CHECK: call void @"??1ImportOverrideVDtor@@UEAA@XZ"(ptr {{[^,]*}} %{{.*}})41// CHECK: call void @"??1ImportIntroVDtor@@UEAA@XZ"(ptr {{[^,]*}} %{{.*}})42 43// CHECK-LABEL: declare dllimport void @"??_DImportVBaseOverrideVDtor@@QEAAXXZ"44// CHECK-LABEL: declare dllimport void @"??1ImportOverrideVDtor@@UEAA@XZ"45// CHECK-LABEL: declare dllimport void @"??1ImportIntroVDtor@@UEAA@XZ"46