[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