1 // RUN: %check_clang_tidy %s readability-delete-null-pointer %t
2 
3 #define NULL 0
4 
f()5 void f() {
6   int *ps = 0;
7   if (ps /**/) // #0
8     delete ps;
9   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer]
10 
11   // CHECK-FIXES: int *ps = 0;
12   // CHECK-FIXES-NEXT: {{^  }}// #0
13   // CHECK-FIXES-NEXT: delete ps;
14 
15   int *p = 0;
16 
17   // #1
18   if (p) { // #2
19     delete p;
20   } // #3
21   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer]
22 
23   // CHECK-FIXES: {{^  }}// #1
24   // CHECK-FIXES-NEXT: {{^  }}// #2
25   // CHECK-FIXES-NEXT: delete p;
26   // CHECK-FIXES-NEXT: {{^  }}// #3
27 
28   int *p2 = new int[3];
29   // #4
30   if (p2) // #5
31     delete[] p2;
32   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: 'if' statement is unnecessary;
33 
34   // CHECK-FIXES: // #4
35   // CHECK-FIXES-NEXT: {{^  }}// #5
36   // CHECK-FIXES-NEXT: delete[] p2;
37 
38   int *p3 = 0;
39   if (NULL != p3) {
40     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary;
41     delete p3;
42   }
43   // CHECK-FIXES-NOT: if (NULL != p3) {
44   // CHECK-FIXES: delete p3;
45 
46   int *p4 = nullptr;
47   if (p4 != nullptr) {
48     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary;
49     delete p4;
50   }
51   // CHECK-FIXES-NOT: if (p4 != nullptr) {
52   // CHECK-FIXES: delete p4;
53 
54   char *c;
55   if (c != 0) {
56     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary;
57     delete c;
58   }
59   // CHECK-FIXES-NOT: if (c != 0) {
60   // CHECK-FIXES: delete c;
61 
62   char *c2;
63   if (c2) {
64     // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary;
65     // CHECK-FIXES: } else {
66     // CHECK-FIXES: c2 = c;
67     delete c2;
68   } else {
69     c2 = c;
70   }
71   struct A {
72     void foo() {
73       if (mp) // #6
74         delete mp;
75       // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer]
76       // CHECK-FIXES: {{^      }}// #6
77       // CHECK-FIXES-NEXT: delete mp;
78     }
79     int *mp;
80   };
81 }
82 
g()83 void g() {
84   int *p5, *p6;
85   if (p5)
86     delete p6;
87 
88   if (p5 && p6)
89     delete p5;
90 
91   if (p6) {
92     int x = 5;
93     delete p6;
94   }
95 }
96