@@ -7924,6 +7924,9 @@ void CodeGenModule::moveLazyEmissionStates(CodeGenModule *NewBuilder) {
79247924
79257925bool CodeGenModule::classNeedsVectorDestructor (const CXXRecordDecl *RD) {
79267926 CXXDestructorDecl *Dtor = RD->getDestructor ();
7927+ // The compiler can't know if new[]/delete[] will be used outside of the DLL,
7928+ // so just force vector deleting destructor emission if dllexport is present.
7929+ // This matches MSVC behavior.
79277930 if (Dtor && Dtor->isVirtual () && Dtor->isDefined () &&
79287931 Dtor->hasAttr <DLLExportAttr>())
79297932 return true ;
@@ -7935,6 +7938,14 @@ bool CodeGenModule::classNeedsVectorDestructor(const CXXRecordDecl *RD) {
79357938void CodeGenModule::requireVectorDestructorDefinition (const CXXRecordDecl *RD) {
79367939 assert (getCXXABI ().hasVectorDeletingDtors ());
79377940 RequireVectorDeletingDtor.insert (RD);
7941+
7942+ // To reduce code size in general case we lazily emit scalar deleting
7943+ // destructor definition and an alias from vector deleting destructor to
7944+ // scalar deleting destructor. It may happen that we first emitted the scalar
7945+ // deleting destructor definition and the alias and then discovered that the
7946+ // definition of the vector deleting destructor is required. Then we need to
7947+ // remove the alias and the scalar deleting destructor and queue vector
7948+ // deleting destructor body for emission. Check if that is the case.
79387949 CXXDestructorDecl *DtorD = RD->getDestructor ();
79397950 GlobalDecl ScalarDtorGD (DtorD, Dtor_Deleting);
79407951 StringRef MangledName = getMangledName (ScalarDtorGD);
0 commit comments