[clang] Reland [MS][clang] Add support for vector deleting destructors (PR #165598)

via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 29 10:16:03 PDT 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,h,cppm -- clang/test/CodeGenCXX/microsoft-vector-deleting-dtors.cpp clang/test/Modules/Inputs/msvc-vector-deleting-dtors/msvc-vector-deleting-dtors.h clang/test/Modules/msvc-vector-deleting-destructors.cpp clang/test/PCH/Inputs/msvc-vector-deleting-dtors.h clang/test/PCH/msvc-vector-deleting-destructors.cpp clang/test/SemaCXX/gh134265.cpp clang/include/clang/AST/ASTContext.h clang/include/clang/AST/ASTMutationListener.h clang/include/clang/AST/DeclCXX.h clang/include/clang/AST/VTableBuilder.h clang/include/clang/Basic/ABI.h clang/include/clang/Basic/TargetInfo.h clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTWriter.h clang/lib/AST/ASTContext.cpp clang/lib/AST/DeclCXX.cpp clang/lib/AST/Expr.cpp clang/lib/AST/ItaniumMangle.cpp clang/lib/AST/MicrosoftMangle.cpp clang/lib/AST/VTableBuilder.cpp clang/lib/Basic/TargetInfo.cpp clang/lib/CodeGen/CGCXX.cpp clang/lib/CodeGen/CGCXXABI.cpp clang/lib/CodeGen/CGCXXABI.h clang/lib/CodeGen/CGClass.cpp clang/lib/CodeGen/CGDebugInfo.cpp clang/lib/CodeGen/CGExprCXX.cpp clang/lib/CodeGen/CGVTables.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/CodeGenModule.h clang/lib/CodeGen/ItaniumCXXABI.cpp clang/lib/CodeGen/MicrosoftCXXABI.cpp clang/lib/Sema/SemaDeclCXX.cpp clang/lib/Sema/SemaExprCXX.cpp clang/lib/Serialization/ASTCommon.h clang/lib/Serialization/ASTReaderDecl.cpp clang/lib/Serialization/ASTWriter.cpp clang/lib/Serialization/ASTWriterDecl.cpp clang/test/CodeGenCXX/dllexport.cpp clang/test/CodeGenCXX/microsoft-abi-extern-template.cpp clang/test/CodeGenCXX/microsoft-abi-structors.cpp clang/test/CodeGenCXX/microsoft-abi-thunks.cpp clang/test/CodeGenCXX/microsoft-abi-vftables.cpp clang/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-vdtors.cpp clang/test/CodeGenCXX/microsoft-abi-vtables-return-thunks.cpp clang/test/CodeGenCXX/microsoft-abi-vtables-single-inheritance.cpp clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance-vtordisps.cpp clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp clang/test/CodeGenCXX/microsoft-no-rtti-data.cpp clang/test/CodeGenCXX/vtable-consteval.cpp clang/test/DebugInfo/CXX/windows-dtor.cpp clang/test/Modules/vtable-windows.cppm clang/test/Profile/cxx-abc-deleting-dtor.cpp --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h
index 9723e84f9..6e9e737dc 100644
--- a/clang/include/clang/AST/ASTContext.h
+++ b/clang/include/clang/AST/ASTContext.h
@@ -3485,12 +3485,7 @@ public:
                                          bool IsTypeAware);
   bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const;
 
-  enum OperatorDeleteKind {
-    Regular,
-    GlobalRegular,
-    Array,
-    ArrayGlobal
-  };
+  enum OperatorDeleteKind { Regular, GlobalRegular, Array, ArrayGlobal };
 
   void addOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor,
                                  FunctionDecl *OperatorDelete,
diff --git a/clang/include/clang/AST/ASTMutationListener.h b/clang/include/clang/AST/ASTMutationListener.h
index 96d72b4a5..c8448a25c 100644
--- a/clang/include/clang/AST/ASTMutationListener.h
+++ b/clang/include/clang/AST/ASTMutationListener.h
@@ -92,7 +92,7 @@ public:
 
   /// A virtual destructor's operator array delete has been resolved.
   virtual void ResolvedOperatorArrayDelete(const CXXDestructorDecl *DD,
-                                          const FunctionDecl *ArrayDelete) {}
+                                           const FunctionDecl *ArrayDelete) {}
 
   /// A virtual destructor's operator global array delete has been resolved.
   virtual void
diff --git a/clang/include/clang/Basic/ABI.h b/clang/include/clang/Basic/ABI.h
index ba1beb04a..be3edccbf 100644
--- a/clang/include/clang/Basic/ABI.h
+++ b/clang/include/clang/Basic/ABI.h
@@ -32,11 +32,11 @@ enum CXXCtorType {
 
 /// C++ destructor types.
 enum CXXDtorType {
-  Dtor_Deleting, ///< Deleting dtor
-  Dtor_Complete, ///< Complete object dtor
-  Dtor_Base,     ///< Base object dtor
-  Dtor_Comdat,   ///< The COMDAT used for dtors
-  Dtor_Unified,  ///< GCC-style unified dtor
+  Dtor_Deleting,       ///< Deleting dtor
+  Dtor_Complete,       ///< Complete object dtor
+  Dtor_Base,           ///< Base object dtor
+  Dtor_Comdat,         ///< The COMDAT used for dtors
+  Dtor_Unified,        ///< GCC-style unified dtor
   Dtor_VectorDeleting, ///< Vector deleting dtor
 };
 
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 3c32a005a..04a2cfa15 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13372,8 +13372,9 @@ bool ASTContext::dtorHasOperatorDelete(const CXXDestructorDecl *Dtor,
   return false;
 }
 
-FunctionDecl *ASTContext::getOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor,
-                                        OperatorDeleteKind K) const {
+FunctionDecl *
+ASTContext::getOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor,
+                                      OperatorDeleteKind K) const {
   const CXXDestructorDecl *Canon = Dtor->getCanonicalDecl();
   switch (K) {
   case OperatorDeleteKind::Regular:
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 344ba7b9b..c16b1bb7a 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -3112,7 +3112,7 @@ CXXDestructorDecl *CXXDestructorDecl::Create(
 void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
   assert(!OD || (OD->getDeclName().getCXXOverloadedOperator() == OO_Delete));
   if (OD && !getASTContext().dtorHasOperatorDelete(
-          this, ASTContext::OperatorDeleteKind::Regular)) {
+                this, ASTContext::OperatorDeleteKind::Regular)) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::Regular);
     getCanonicalDecl()->OperatorDeleteThisArg = ThisArg;
@@ -3131,7 +3131,7 @@ void CXXDestructorDecl::setOperatorGlobalDelete(FunctionDecl *OD) {
          (OD->getDeclName().getCXXOverloadedOperator() == OO_Delete &&
           OD->getDeclContext()->getRedeclContext()->isTranslationUnit()));
   if (OD && !getASTContext().dtorHasOperatorDelete(
-          this, ASTContext::OperatorDeleteKind::GlobalRegular)) {
+                this, ASTContext::OperatorDeleteKind::GlobalRegular)) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::GlobalRegular);
     if (auto *L = getASTMutationListener())
@@ -3144,7 +3144,7 @@ void CXXDestructorDecl::setOperatorArrayDelete(FunctionDecl *OD) {
   assert(!OD ||
          (OD->getDeclName().getCXXOverloadedOperator() == OO_Array_Delete));
   if (OD && !getASTContext().dtorHasOperatorDelete(
-          this, ASTContext::OperatorDeleteKind::Array)) {
+                this, ASTContext::OperatorDeleteKind::Array)) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::Array);
     if (auto *L = getASTMutationListener())
@@ -3158,7 +3158,7 @@ void CXXDestructorDecl::setGlobalOperatorArrayDelete(FunctionDecl *OD) {
          (OD->getDeclName().getCXXOverloadedOperator() == OO_Array_Delete &&
           OD->getDeclContext()->getRedeclContext()->isTranslationUnit()));
   if (OD && !getASTContext().dtorHasOperatorDelete(
-          this, ASTContext::OperatorDeleteKind::ArrayGlobal)) {
+                this, ASTContext::OperatorDeleteKind::ArrayGlobal)) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::ArrayGlobal);
     if (auto *L = getASTMutationListener())
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 42cf31288..51fbacf0a 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -1516,8 +1516,7 @@ static void EmitConditionalArrayDtorCall(const CXXDestructorDecl *DD,
         CGF.createBasicBlock("dtor.call_glob_delete_after_array_destroy");
     llvm::BasicBlock *ClassDelete =
         CGF.createBasicBlock("dtor.call_class_delete_after_array_destroy");
-    CGF.Builder.CreateCondBr(ShouldCallGlobDelete, ClassDelete,
-                             GlobDelete);
+    CGF.Builder.CreateCondBr(ShouldCallGlobDelete, ClassDelete, GlobDelete);
     CGF.EmitBlock(ClassDelete);
     CGF.EmitDeleteCall(Dtor->getArrayOperatorDelete(), allocatedPtr,
                        CGF.getContext().getCanonicalTagType(ClassDecl));
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 573456e66..e51853670 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11210,10 +11210,9 @@ bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) {
                                                     VDeleteName);
           Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
         } else if (!ArrOperatorDelete) {
-          ArrOperatorDelete =
-              FindDeallocationFunctionForDestructor(Loc, RD, /*Diagnose*/ false,
-                                                    /*LookForGlobal*/ true,
-                                                    VDeleteName);
+          ArrOperatorDelete = FindDeallocationFunctionForDestructor(
+              Loc, RD, /*Diagnose*/ false,
+              /*LookForGlobal*/ true, VDeleteName);
         }
         assert(ArrOperatorDelete &&
                "Should've found at least global array delete");
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index cbc0d9ece..0ee8c3511 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -4897,7 +4897,7 @@ void ASTDeclReader::UpdateDecl(Decl *D) {
       ASTContext &C = Reader.getContext();
       if (!C.dtorHasOperatorDelete(Dtor, ASTContext::OperatorDeleteKind::Array))
         C.addOperatorDeleteForVDtor(Dtor, Del,
-                                   ASTContext::OperatorDeleteKind::Array);
+                                    ASTContext::OperatorDeleteKind::Array);
       break;
     }
     case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete: {

``````````

</details>


https://github.com/llvm/llvm-project/pull/165598


More information about the cfe-commits mailing list