Index: lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- lib/CodeGen/MicrosoftCXXABI.cpp +++ lib/CodeGen/MicrosoftCXXABI.cpp @@ -3824,9 +3824,8 @@ 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 or classes that have dllimport attribute, - // so try to emit it as an alias. - if ((!dtor->getParent()->getNumVBases() || dtor->hasAttr()) && + // classes with no virtual bases, so try to emit it as an alias. + if (!dtor->getParent()->getNumVBases() && (dtorType == StructorType::Complete || dtorType == StructorType::Base)) { bool ProducedAlias = !CGM.TryEmitDefinitionAsAlias( GlobalDecl(dtor, Dtor_Complete), GlobalDecl(dtor, Dtor_Base)); Index: test/CodeGenCXX/dllimport-base.cpp =================================================================== --- test/CodeGenCXX/dllimport-base.cpp +++ test/CodeGenCXX/dllimport-base.cpp @@ -7,8 +7,7 @@ namespace test1 { struct __declspec(dllimport) VirtualClass { -public: - virtual ~VirtualClass(){}; + virtual ~VirtualClass(); }; int main() { @@ -18,14 +17,12 @@ } // namespace test1 namespace test2 { -class BaseClass { -public: - virtual ~BaseClass(){}; +struct BaseClass { + virtual ~BaseClass(); }; -class __declspec(dllimport) VirtualClass : public BaseClass { -public: - virtual ~VirtualClass(){}; +struct __declspec(dllimport) VirtualClass : public BaseClass { + virtual ~VirtualClass(); }; int main() { @@ -35,14 +32,13 @@ } // namespace test2 namespace test3 { -class BaseClass { -public: - virtual ~BaseClass(){}; +struct BaseClass { + virtual ~BaseClass(); }; -class __declspec(dllimport) VirtualClass : public virtual BaseClass { +struct __declspec(dllimport) VirtualClass : public virtual BaseClass { public: - virtual ~VirtualClass(){}; + virtual ~VirtualClass(); }; int main() {