1 // RUN: %check_clang_tidy %s readability-delete-null-pointer %t -- -- -fno-delayed-template-parsing 2 3 #define NULL 0 4 5 template <typename T> 6 struct Templ { 7 void foo() { 8 // t1 9 if (mem) // t2 10 delete mem; 11 // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: 'if' statement is unnecessary; 12 // CHECK-FIXES: // t1 13 // CHECK-FIXES-NEXT: {{^ }}// t2 14 // CHECK-FIXES-NEXT: delete mem; 15 } 16 T mem; 17 }; 18 19 template <typename T> 20 struct TemplPtr { 21 void foo() { 22 // t3 23 if (mem) // t4 24 delete mem; 25 // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: 'if' statement is unnecessary; 26 // CHECK-FIXES: // t3 27 // CHECK-FIXES-NEXT: {{^ }}// t4 28 // CHECK-FIXES-NEXT: delete mem; 29 } 30 T *mem; 31 }; 32 33 void instantiate() { 34 Templ<int *> ti2; 35 ti2.foo(); 36 TemplPtr<int> ti3; 37 ti3.foo(); 38 } 39 40 template <typename T> 41 struct NeverInstantiated { 42 void foo() { 43 // t1 44 if (mem) // t2 45 delete mem; 46 // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: 'if' statement is unnecessary; 47 // CHECK-FIXES: // t1 48 // CHECK-FIXES-NEXT: {{^ }}// t2 49 // CHECK-FIXES-NEXT: delete mem; 50 } 51 T mem; 52 }; 53 54 template <typename T> 55 struct NeverInstantiatedPtr { 56 void foo() { 57 // t3 58 if (mem) // t4 59 delete mem; 60 // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: 'if' statement is unnecessary; 61 // CHECK-FIXES: // t3 62 // CHECK-FIXES-NEXT: {{^ }}// t4 63 // CHECK-FIXES-NEXT: delete mem; 64 } 65 T *mem; 66 }; 67 68 void f() { 69 int *ps = 0; 70 if (ps /**/) // #0 71 delete ps; 72 // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer] 73 74 // CHECK-FIXES: int *ps = 0; 75 // CHECK-FIXES-NEXT: {{^ }}// #0 76 // CHECK-FIXES-NEXT: delete ps; 77 78 int *p = 0; 79 80 // #1 81 if (p) { // #2 82 delete p; 83 } // #3 84 // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer] 85 86 // CHECK-FIXES: {{^ }}// #1 87 // CHECK-FIXES-NEXT: {{^ }}// #2 88 // CHECK-FIXES-NEXT: delete p; 89 // CHECK-FIXES-NEXT: {{^ }}// #3 90 91 int *p2 = new int[3]; 92 // #4 93 if (p2) // #5 94 delete[] p2; 95 // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: 'if' statement is unnecessary; 96 97 // CHECK-FIXES: // #4 98 // CHECK-FIXES-NEXT: {{^ }}// #5 99 // CHECK-FIXES-NEXT: delete[] p2; 100 101 int *p3 = 0; 102 if (NULL != p3) { 103 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; 104 delete p3; 105 } 106 // CHECK-FIXES-NOT: if (NULL != p3) { 107 // CHECK-FIXES: delete p3; 108 109 int *p4 = nullptr; 110 if (p4 != nullptr) { 111 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; 112 delete p4; 113 } 114 // CHECK-FIXES-NOT: if (p4 != nullptr) { 115 // CHECK-FIXES: delete p4; 116 117 char *c; 118 if (c != 0) { 119 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; 120 delete c; 121 } 122 // CHECK-FIXES-NOT: if (c != 0) { 123 // CHECK-FIXES: delete c; 124 125 char *c2; 126 if (c2) { 127 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'if' statement is unnecessary; 128 // CHECK-FIXES: } else { 129 // CHECK-FIXES: c2 = c; 130 delete c2; 131 } else { 132 c2 = c; 133 } 134 struct A { 135 void foo() { 136 if (mp) // #6 137 delete mp; 138 // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: 'if' statement is unnecessary; deleting null pointer has no effect [readability-delete-null-pointer] 139 // CHECK-FIXES: {{^ }}// #6 140 // CHECK-FIXES-NEXT: delete mp; 141 } 142 int *mp; 143 }; 144 } 145 146 void g() { 147 int *p5, *p6; 148 if (p5) 149 delete p6; 150 151 if (p5 && p6) 152 delete p5; 153 154 if (p6) { 155 int x = 5; 156 delete p6; 157 } 158 } 159