summaryrefslogtreecommitdiff
path: root/clang/lib/AST/DeclCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r--clang/lib/AST/DeclCXX.cpp73
1 files changed, 10 insertions, 63 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index c16b1bb7a345..24e4f189cbe4 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -3110,15 +3110,12 @@ 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)) {
- getASTContext().addOperatorDeleteForVDtor(
- this, OD, ASTContext::OperatorDeleteKind::Regular);
- getCanonicalDecl()->OperatorDeleteThisArg = ThisArg;
+ auto *First = cast<CXXDestructorDecl>(getFirstDecl());
+ if (OD && !First->OperatorDelete) {
+ First->OperatorDelete = OD;
+ First->OperatorDeleteThisArg = ThisArg;
if (auto *L = getASTMutationListener())
- L->ResolvedOperatorDelete(cast<CXXDestructorDecl>(getCanonicalDecl()), OD,
- ThisArg);
+ L->ResolvedOperatorDelete(First, OD, ThisArg);
}
}
@@ -3130,63 +3127,14 @@ void CXXDestructorDecl::setOperatorGlobalDelete(FunctionDecl *OD) {
assert(!OD ||
(OD->getDeclName().getCXXOverloadedOperator() == OO_Delete &&
OD->getDeclContext()->getRedeclContext()->isTranslationUnit()));
- if (OD && !getASTContext().dtorHasOperatorDelete(
- this, ASTContext::OperatorDeleteKind::GlobalRegular)) {
- getASTContext().addOperatorDeleteForVDtor(
- this, OD, ASTContext::OperatorDeleteKind::GlobalRegular);
+ auto *Canonical = cast<CXXDestructorDecl>(getCanonicalDecl());
+ if (!Canonical->OperatorGlobalDelete) {
+ Canonical->OperatorGlobalDelete = OD;
if (auto *L = getASTMutationListener())
- L->ResolvedOperatorGlobDelete(cast<CXXDestructorDecl>(getCanonicalDecl()),
- OD);
+ L->ResolvedOperatorGlobDelete(Canonical, OD);
}
}
-void CXXDestructorDecl::setOperatorArrayDelete(FunctionDecl *OD) {
- assert(!OD ||
- (OD->getDeclName().getCXXOverloadedOperator() == OO_Array_Delete));
- if (OD && !getASTContext().dtorHasOperatorDelete(
- this, ASTContext::OperatorDeleteKind::Array)) {
- getASTContext().addOperatorDeleteForVDtor(
- this, OD, ASTContext::OperatorDeleteKind::Array);
- if (auto *L = getASTMutationListener())
- L->ResolvedOperatorArrayDelete(
- cast<CXXDestructorDecl>(getCanonicalDecl()), OD);
- }
-}
-
-void CXXDestructorDecl::setGlobalOperatorArrayDelete(FunctionDecl *OD) {
- assert(!OD ||
- (OD->getDeclName().getCXXOverloadedOperator() == OO_Array_Delete &&
- OD->getDeclContext()->getRedeclContext()->isTranslationUnit()));
- if (OD && !getASTContext().dtorHasOperatorDelete(
- this, ASTContext::OperatorDeleteKind::ArrayGlobal)) {
- getASTContext().addOperatorDeleteForVDtor(
- this, OD, ASTContext::OperatorDeleteKind::ArrayGlobal);
- if (auto *L = getASTMutationListener())
- L->ResolvedOperatorGlobArrayDelete(
- cast<CXXDestructorDecl>(getCanonicalDecl()), OD);
- }
-}
-
-const FunctionDecl *CXXDestructorDecl::getOperatorDelete() const {
- return getASTContext().getOperatorDeleteForVDtor(
- this, ASTContext::OperatorDeleteKind::Regular);
-}
-
-const FunctionDecl *CXXDestructorDecl::getOperatorGlobalDelete() const {
- return getASTContext().getOperatorDeleteForVDtor(
- this, ASTContext::OperatorDeleteKind::GlobalRegular);
-}
-
-const FunctionDecl *CXXDestructorDecl::getArrayOperatorDelete() const {
- return getASTContext().getOperatorDeleteForVDtor(
- this, ASTContext::OperatorDeleteKind::Array);
-}
-
-const FunctionDecl *CXXDestructorDecl::getGlobalArrayOperatorDelete() const {
- return getASTContext().getOperatorDeleteForVDtor(
- this, ASTContext::OperatorDeleteKind::ArrayGlobal);
-}
-
bool CXXDestructorDecl::isCalledByDelete(const FunctionDecl *OpDel) const {
// C++20 [expr.delete]p6: If the value of the operand of the delete-
// expression is not a null pointer value and the selected deallocation
@@ -3198,8 +3146,7 @@ bool CXXDestructorDecl::isCalledByDelete(const FunctionDecl *OpDel) const {
// delete operator, as that destructor is never called, unless the
// destructor is virtual (see [expr.delete]p8.1) because then the
// selected operator depends on the dynamic type of the pointer.
- const FunctionDecl *SelectedOperatorDelete =
- OpDel ? OpDel : getOperatorDelete();
+ const FunctionDecl *SelectedOperatorDelete = OpDel ? OpDel : OperatorDelete;
if (!SelectedOperatorDelete)
return true;