// RUN: %check_clang_tidy %s readability-delete-null-pointer %t #define NULL 0 void f() { int *p = 0; // #1 if (p) { // #2 delete p; } // #3 // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer] // CHECK-FIXES: {{^ }}// #1 // CHECK-FIXES-NEXT: {{^ }}// #2 // CHECK-FIXES-NEXT: delete p; // CHECK-FIXES-NEXT: {{^ }}// #3 int *p2 = new int[3]; // #4 if (p2) // #5 delete[] p2; // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: 'if' statement is unnecessary; // CHECK-FIXES: // #4 // CHECK-FIXES-NEXT: {{^ }}// #5 // CHECK-FIXES-NEXT: delete[] p2; int *p3 = 0; if (NULL != p3) { // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; delete p3; } // CHECK-FIXES-NOT: if (NULL != p3) { // CHECK-FIXES: delete p3; int *p4 = nullptr; if (p4 != nullptr) { // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; delete p4; } // CHECK-FIXES-NOT: if (p4 != nullptr) { // CHECK-FIXES: delete p4; char *c; if (c != 0) { // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; delete c; } // CHECK-FIXES-NOT: if (c != 0) { // CHECK-FIXES: delete c; char *c2; if (c2) { // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; // CHECK-FIXES: } else { // CHECK-FIXES: c2 = c; delete c2; } 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() { int *p5, *p6; if (p5) delete p6; if (p5 && p6) delete p5; if (p6) { int x = 5; delete p6; } }