================
@@ -1255,15 +1255,23 @@ class Analyzer {
}
bool VisitCXXDeleteExpr(CXXDeleteExpr *Delete) override {
+ FunctionDecl *OpDelete = Delete->getOperatorDelete();
+
+ // RecursiveASTVisitor does not visit the called destructor.
+ // But a destroying operator delete means that no destructor is called.
+ if (OpDelete == nullptr || !OpDelete->isDestroyingOperatorDelete()) {
----------------
dougsonos wrote:
I had that same question and answered it by seeing if other users of
`CXXDeleteExpr` checked for a null `getOperatorDelete()`. I found this in
Sema::MarkVTableUsed():
```
if (DD && DD->isVirtual() && !DD->isDeleted()) {
if (Class->hasUserDeclaredDestructor() && !DD->isDefined()) {
// If this is an out-of-line declaration, marking it referenced will
// not do anything. Manually call CheckDestructor to look up operator
// delete().
ContextRAII SavedContext(*this, DD);
CheckDestructor(DD);
if (!DD->getOperatorDelete())
DD->setInvalidDecl();
```
And:
```
template<typename Derived>
ExprResult
TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
ExprResult Operand = getDerived().TransformExpr(E->getArgument());
if (Operand.isInvalid())
return ExprError();
// Transform the delete operator, if known.
FunctionDecl *OperatorDelete = nullptr;
if (E->getOperatorDelete()) {
```
https://github.com/llvm/llvm-project/pull/184460
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits