357 lines · cpp
1// RUN: %check_clang_tidy %s readability-simplify-boolean-expr %t2 3class A {4public:5 int m;6};7 8struct S {9 S() : m_ar(s_a) {}10 11 void operator_equals();12 void operator_or();13 void operator_and();14 void ternary_operator();15 void operator_not_equal();16 void simple_conditional_assignment_statements();17 void complex_conditional_assignment_statements();18 void chained_conditional_assignment();19 bool non_null_pointer_condition();20 bool null_pointer_condition();21 bool negated_non_null_pointer_condition();22 bool negated_null_pointer_condition();23 bool integer_not_zero();24 bool member_pointer_nullptr();25 bool integer_member_implicit_cast();26 bool expr_with_cleanups();27 28 bool m_b1 = false;29 bool m_b2 = false;30 bool m_b3 = false;31 bool m_b4 = false;32 int *m_p = nullptr;33 int A::*m_m = nullptr;34 int m_i = 0;35 A *m_a = nullptr;36 static A s_a;37 A &m_ar;38};39 40void S::operator_equals() {41 int i = 0;42 m_b1 = (i > 2);43 if (m_b1 == true) {44 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator45 // CHECK-FIXES: if (m_b1) {46 i = 5;47 } else {48 i = 6;49 }50 m_b2 = (i > 4);51 if (m_b2 == false) {52 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator53 // CHECK-FIXES: if (!m_b2) {54 i = 7;55 } else {56 i = 9;57 }58 m_b3 = (i > 6);59 if (true == m_b3) {60 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator61 // CHECK-FIXES: if (m_b3) {62 i = 10;63 } else {64 i = 11;65 }66 m_b4 = (i > 8);67 if (false == m_b4) {68 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator69 // CHECK-FIXES: if (!m_b4) {70 i = 12;71 } else {72 i = 13;73 }74}75 76void S::operator_or() {77 int i = 0;78 m_b1 = (i > 10);79 if (m_b1 || false) {80 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator81 // CHECK-FIXES: if (m_b1) {82 i = 14;83 } else {84 i = 15;85 }86 m_b2 = (i > 10);87 if (m_b2 || true) {88 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator89 // CHECK-FIXES: if (true) {90 i = 16;91 } else {92 i = 17;93 }94 m_b3 = (i > 10);95 if (false || m_b3) {96 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator97 // CHECK-FIXES: if (m_b3) {98 i = 18;99 } else {100 i = 19;101 }102 m_b4 = (i > 10);103 if (true || m_b4) {104 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator105 // CHECK-FIXES: if (true) {106 i = 20;107 } else {108 i = 21;109 }110}111 112void S::operator_and() {113 int i = 0;114 m_b1 = (i > 20);115 if (m_b1 && false) {116 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator117 // CHECK-FIXES: if (false) {118 i = 22;119 } else {120 i = 23;121 }122 m_b2 = (i > 20);123 if (m_b2 && true) {124 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator125 // CHECK-FIXES: if (m_b2) {126 i = 24;127 } else {128 i = 25;129 }130 m_b3 = (i > 20);131 if (false && m_b3) {132 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator133 // CHECK-FIXES: if (false) {134 i = 26;135 } else {136 i = 27;137 }138 m_b4 = (i > 20);139 if (true && m_b4) {140 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator141 // CHECK-FIXES: if (m_b4) {142 i = 28;143 } else {144 i = 29;145 }146}147 148void S::ternary_operator() {149 int i = 0;150 m_b1 = (i > 20) ? true : false;151 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in ternary expression result152 // CHECK-FIXES: m_b1 = i > 20;153 154 m_b2 = (i > 20) ? false : true;155 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in ternary expression result156 // CHECK-FIXES: m_b2 = i <= 20;157 158 m_b3 = ((i > 20)) ? false : true;159 // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: {{.*}} in ternary expression result160 // CHECK-FIXES: m_b3 = i <= 20;161}162 163void S::operator_not_equal() {164 int i = 0;165 m_b1 = (i > 20);166 if (false != m_b1) {167 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator168 // CHECK-FIXES: if (m_b1) {169 i = 30;170 } else {171 i = 31;172 }173 m_b2 = (i > 20);174 if (true != m_b2) {175 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator176 // CHECK-FIXES: if (!m_b2) {177 i = 32;178 } else {179 i = 33;180 }181 m_b3 = (i > 20);182 if (m_b3 != false) {183 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator184 // CHECK-FIXES: if (m_b3) {185 i = 34;186 } else {187 i = 35;188 }189 m_b4 = (i > 20);190 if (m_b4 != true) {191 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} to boolean operator192 // CHECK-FIXES: if (!m_b4) {193 i = 36;194 } else {195 i = 37;196 }197}198 199void S::simple_conditional_assignment_statements() {200 if (m_i > 10)201 m_b1 = true;202 else203 m_b1 = false;204 bool bb = false;205 // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional assignment206 // CHECK-FIXES: m_b1 = m_i > 10;207 // CHECK-FIXES: bool bb = false;208 209 if (m_i > 20)210 m_b2 = false;211 else212 m_b2 = true;213 bool c2 = false;214 // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional assignment215 // CHECK-FIXES: m_b2 = m_i <= 20;216 // CHECK-FIXES: bool c2 = false;217 218 // Unchanged: different variables.219 if (m_i > 12)220 m_b1 = true;221 else222 m_b2 = false;223 224 // Unchanged: no else statement.225 if (m_i > 15)226 m_b3 = true;227 228 // Unchanged: not boolean assignment.229 int j;230 if (m_i > 17)231 j = 10;232 else233 j = 20;234 235 // Unchanged: different variables assigned.236 int k = 0;237 m_b4 = false;238 if (m_i > 10)239 m_b4 = true;240 else241 k = 10;242}243 244void S::complex_conditional_assignment_statements() {245 if (m_i > 30) {246 m_b1 = true;247 } else {248 m_b1 = false;249 }250 m_b1 = false;251 // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional assignment252 // CHECK-FIXES: m_b1 = m_i > 30;253 // CHECK-FIXES: m_b1 = false;254 255 if (m_i > 40) {256 m_b2 = false;257 } else {258 m_b2 = true;259 }260 m_b2 = false;261 // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional assignment262 // CHECK-FIXES: m_b2 = m_i <= 40;263 // CHECK-FIXES: m_b2 = false;264}265 266// Unchanged: chained return statements, but ChainedConditionalReturn not set.267void S::chained_conditional_assignment() {268 if (m_i < 0)269 m_b1 = true;270 else if (m_i < 10)271 m_b1 = false;272 else if (m_i > 20)273 m_b1 = true;274 else275 m_b1 = false;276}277 278bool S::non_null_pointer_condition() {279 if (m_p) {280 return true;281 } else {282 return false;283 }284}285// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return286// CHECK-FIXES: return m_p != nullptr;287 288bool S::null_pointer_condition() {289 if (!m_p) {290 return true;291 } else {292 return false;293 }294}295// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return296// CHECK-FIXES: return m_p == nullptr;297 298bool S::negated_non_null_pointer_condition() {299 if (m_p) {300 return false;301 } else {302 return true;303 }304}305// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return306// CHECK-FIXES: return m_p == nullptr;307 308bool S::negated_null_pointer_condition() {309 if (!m_p) {310 return false;311 } else {312 return true;313 }314}315// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return316// CHECK-FIXES: return m_p != nullptr;317 318bool S::integer_not_zero() {319 if (m_i) {320 return false;321 } else {322 return true;323 }324}325// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return326// CHECK-FIXES: return m_i == 0;327 328bool S::member_pointer_nullptr() {329 if (m_m) {330 return true;331 } else {332 return false;333 }334}335// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return336// CHECK-FIXES: return m_m != nullptr;337 338bool S::integer_member_implicit_cast() {339 if (m_a->m) {340 return true;341 } else {342 return false;343 }344}345// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return346// CHECK-FIXES: return m_a->m != 0;347 348bool operator!=(const A &, const A &) { return false; }349bool S::expr_with_cleanups() {350 if (m_ar != (A)m_ar)351 return false;352 353 return true;354}355// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return356// CHECK-FIXES: return m_ar == (A)m_ar;357