Index: lib/CodeGen/CGCXX.cpp =================================================================== --- lib/CodeGen/CGCXX.cpp +++ lib/CodeGen/CGCXX.cpp @@ -136,7 +136,12 @@ // available_externally definitions aren't real definitions, so we cannot // create an alias to one. - if (TargetLinkage == llvm::GlobalValue::AvailableExternallyLinkage) + // Declarations with dllimport attribute have their linkage set to + // availableExternallyLinkage. In the MS ABI these represent real + // definitions, so an alias can be created. + if (TargetLinkage == llvm::GlobalValue::AvailableExternallyLinkage && + !Context.getTargetInfo().getCXXABI().isMicrosoft() && + !AliasDecl.getDecl()->hasAttr()) return true; // Check if we have it already. Index: lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- lib/CodeGen/MicrosoftCXXABI.cpp +++ lib/CodeGen/MicrosoftCXXABI.cpp @@ -3801,8 +3801,9 @@ static void emitCXXDestructor(CodeGenModule &CGM, const CXXDestructorDecl *dtor, StructorType dtorType) { // The complete destructor is equivalent to the base destructor for - // classes with no virtual bases, so try to emit it as an alias. - if (!dtor->getParent()->getNumVBases() && + // classes with no virtual bases, or classes that have dllimport attribute, + // so try to emit it as an alias. + if ((!dtor->getParent()->getNumVBases() || dtor->hasAttr()) && (dtorType == StructorType::Complete || dtorType == StructorType::Base)) { bool ProducedAlias = !CGM.TryEmitDefinitionAsAlias( GlobalDecl(dtor, Dtor_Complete), GlobalDecl(dtor, Dtor_Base), true); Index: test/CodeGenCXX/dllimport-base.cpp =================================================================== --- /dev/null +++ test/CodeGenCXX/dllimport-base.cpp @@ -0,0 +1,52 @@ +// RUN: %clang_cc1 -triple i386-pc-windows -emit-llvm -fms-compatibility %s -x c++ -o - | FileCheck %s + +// CHECK: declare dllimport x86_thiscallcc void @"\01??1VirtualClass@test1@@UAE@XZ" +// CHECK: declare dllimport x86_thiscallcc void @"\01??1VirtualClass@test2@@UAE@XZ" +// CHECK: declare dllimport x86_thiscallcc void @"\01??1VirtualClass@test3@@UAE@XZ" +// CHECK-NOT: ??_DVirtualClass@@QEAAXXZ + +namespace test1 { +struct __declspec(dllimport) VirtualClass { +public: + virtual ~VirtualClass(){}; +}; + +int main() { + VirtualClass c; + return 0; +} +} // namespace test1 + +namespace test2 { +class BaseClass { +public: + virtual ~BaseClass(){}; +}; + +class __declspec(dllimport) VirtualClass : public BaseClass { +public: + virtual ~VirtualClass(){}; +}; + +int main() { + VirtualClass c; + return 0; +} +} // namespace test2 + +namespace test3 { +class BaseClass { +public: + virtual ~BaseClass(){}; +}; + +class __declspec(dllimport) VirtualClass : public virtual BaseClass { +public: + virtual ~VirtualClass(){}; +}; + +int main() { + VirtualClass c; + return 0; +} +} // namespace test3