diff options
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 73 |
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; |
