Index: clang-tools-extra/trunk/clang-tidy/readability/DeleteNullPointerCheck.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/DeleteNullPointerCheck.h +++ clang-tools-extra/trunk/clang-tidy/readability/DeleteNullPointerCheck.h @@ -16,7 +16,8 @@ namespace tidy { namespace readability { -/// Check whether the 'if' statement is unnecessary before calling 'delete' on a pointer. +/// Check whether the 'if' statement is unnecessary before calling 'delete' on a +/// pointer. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/readability-delete-null-pointer.html Index: clang-tools-extra/trunk/clang-tidy/readability/DeleteNullPointerCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/DeleteNullPointerCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/readability/DeleteNullPointerCheck.cpp @@ -24,8 +24,15 @@ to(decl(equalsBoundNode("deletedPointer")))))))) .bind("deleteExpr"); - const auto PointerExpr = - ignoringImpCasts(declRefExpr(to(decl().bind("deletedPointer")))); + const auto DeleteMemberExpr = + cxxDeleteExpr(has(castExpr(has(memberExpr(hasDeclaration( + fieldDecl(equalsBoundNode("deletedMemberPointer")))))))) + .bind("deleteMemberExpr"); + + const auto PointerExpr = ignoringImpCasts(anyOf( + declRefExpr(to(decl().bind("deletedPointer"))), + memberExpr(hasDeclaration(fieldDecl().bind("deletedMemberPointer"))))); + const auto PointerCondition = castExpr(hasCastKind(CK_PointerToBoolean), hasSourceExpression(PointerExpr)); const auto BinaryPointerCheckCondition = @@ -34,9 +41,11 @@ Finder->addMatcher( ifStmt(hasCondition(anyOf(PointerCondition, BinaryPointerCheckCondition)), - hasThen(anyOf(DeleteExpr, - compoundStmt(has(DeleteExpr), statementCountIs(1)) - .bind("compound")))) + hasThen(anyOf( + DeleteExpr, DeleteMemberExpr, + compoundStmt(has(anyOf(DeleteExpr, DeleteMemberExpr)), + statementCountIs(1)) + .bind("compound")))) .bind("ifWithDelete"), this); } Index: clang-tools-extra/trunk/test/clang-tidy/readability-delete-null-pointer.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-delete-null-pointer.cpp +++ clang-tools-extra/trunk/test/clang-tidy/readability-delete-null-pointer.cpp @@ -59,6 +59,16 @@ } else { c2 = c; } + struct A { + void foo() { + if (mp) // #6 + delete mp; + // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer] + // CHECK-FIXES: {{^ }}// #6 + // CHECK-FIXES-NEXT: delete mp; + } + int *mp; + }; } void g() {