xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr.cpp (revision e69794323338c5279011e6f01c12254da8dff10d)
101025dddSPiotr Zegar // RUN: %check_clang_tidy %s readability-simplify-boolean-expr %t
201025dddSPiotr Zegar 
301025dddSPiotr Zegar bool a1 = false;
401025dddSPiotr Zegar 
501025dddSPiotr Zegar //=-=-=-=-=-=-= operator ==
601025dddSPiotr Zegar bool aa = false == a1;
701025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: redundant boolean literal supplied to boolean operator [readability-simplify-boolean-expr]
801025dddSPiotr Zegar // CHECK-FIXES: {{^bool aa = !a1;$}}
901025dddSPiotr Zegar bool ab = true == a1;
1001025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
1101025dddSPiotr Zegar // CHECK-FIXES: {{^bool ab = a1;$}}
1201025dddSPiotr Zegar bool a2 = a1 == false;
1301025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
1401025dddSPiotr Zegar // CHECK-FIXES: {{^bool a2 = !a1;$}}
1501025dddSPiotr Zegar bool a3 = a1 == true;
1601025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
1701025dddSPiotr Zegar // CHECK-FIXES: {{^bool a3 = a1;$}}
1801025dddSPiotr Zegar 
1901025dddSPiotr Zegar //=-=-=-=-=-=-= operator !=
2001025dddSPiotr Zegar bool n1 = a1 != false;
2101025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
2201025dddSPiotr Zegar // CHECK-FIXES: {{^bool n1 = a1;$}}
2301025dddSPiotr Zegar bool n2 = a1 != true;
2401025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
2501025dddSPiotr Zegar // CHECK-FIXES: {{^bool n2 = !a1;$}}
2601025dddSPiotr Zegar bool n3 = false != a1;
2701025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
2801025dddSPiotr Zegar // CHECK-FIXES: {{^bool n3 = a1;$}}
2901025dddSPiotr Zegar bool n4 = true != a1;
3001025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
3101025dddSPiotr Zegar // CHECK-FIXES: {{^bool n4 = !a1;$}}
3201025dddSPiotr Zegar 
3301025dddSPiotr Zegar //=-=-=-=-=-=-= operator ||
3401025dddSPiotr Zegar bool a4 = a1 || false;
3501025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
3601025dddSPiotr Zegar // CHECK-FIXES: {{^bool a4 = a1;$}}
3701025dddSPiotr Zegar bool a5 = a1 || true;
3801025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
3901025dddSPiotr Zegar // CHECK-FIXES: {{^bool a5 = true;$}}
4001025dddSPiotr Zegar bool a6 = false || a1;
4101025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
4201025dddSPiotr Zegar // CHECK-FIXES: {{^bool a6 = a1;$}}
4301025dddSPiotr Zegar bool a7 = true || a1;
4401025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
4501025dddSPiotr Zegar // CHECK-FIXES: {{^bool a7 = true;$}}
4601025dddSPiotr Zegar 
4701025dddSPiotr Zegar //=-=-=-=-=-=-= operator &&
4801025dddSPiotr Zegar bool a8 = a1 && false;
4901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
5001025dddSPiotr Zegar // CHECK-FIXES: {{^bool a8 = false;$}}
5101025dddSPiotr Zegar bool a9 = a1 && true;
5201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
5301025dddSPiotr Zegar // CHECK-FIXES: {{^bool a9 = a1;$}}
5401025dddSPiotr Zegar bool ac = false && a1;
5501025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
5601025dddSPiotr Zegar // CHECK-FIXES: {{^bool ac = false;$}}
5701025dddSPiotr Zegar bool ad = true && a1;
5801025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator
5901025dddSPiotr Zegar // CHECK-FIXES: {{^bool ad = a1;$}}
6001025dddSPiotr Zegar 
if_with_bool_literal_condition()6101025dddSPiotr Zegar void if_with_bool_literal_condition() {
6201025dddSPiotr Zegar   int i = 0;
6301025dddSPiotr Zegar   if (false) {
6401025dddSPiotr Zegar     i = 1;
6501025dddSPiotr Zegar   } else {
6601025dddSPiotr Zegar     i = 2;
6701025dddSPiotr Zegar   }
6801025dddSPiotr Zegar   i = 3;
6901025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition
7001025dddSPiotr Zegar   // CHECK-FIXES:      {{^  int i = 0;$}}
7101025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  {$}}
7201025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^    i = 2;$}}
7301025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  }$}}
7401025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  i = 3;$}}
7501025dddSPiotr Zegar 
7601025dddSPiotr Zegar   i = 4;
7701025dddSPiotr Zegar   if (true) {
7801025dddSPiotr Zegar     i = 5;
7901025dddSPiotr Zegar   } else {
8001025dddSPiotr Zegar     i = 6;
8101025dddSPiotr Zegar   }
8201025dddSPiotr Zegar   i = 7;
8301025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition
8401025dddSPiotr Zegar   // CHECK-FIXES:      {{^  i = 4;$}}
8501025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  {$}}
8601025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^    i = 5;$}}
8701025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  }$}}
8801025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  i = 7;$}}
8901025dddSPiotr Zegar 
9001025dddSPiotr Zegar   i = 8;
9101025dddSPiotr Zegar   if (false) {
9201025dddSPiotr Zegar     i = 9;
9301025dddSPiotr Zegar   }
9401025dddSPiotr Zegar   i = 11;
9501025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition
9601025dddSPiotr Zegar   // CHECK-FIXES:      {{^  i = 8;$}}
9701025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  $}}
9801025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  i = 11;$}}
9901025dddSPiotr Zegar }
10001025dddSPiotr Zegar 
if_with_negated_bool_condition()10101025dddSPiotr Zegar void if_with_negated_bool_condition() {
10201025dddSPiotr Zegar   int i = 10;
10301025dddSPiotr Zegar   if (!true) {
10401025dddSPiotr Zegar     i = 11;
10501025dddSPiotr Zegar   } else {
10601025dddSPiotr Zegar     i = 12;
10701025dddSPiotr Zegar   }
10801025dddSPiotr Zegar   i = 13;
10901025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition
11001025dddSPiotr Zegar   // CHECK-FIXES:      {{^  int i = 10;$}}
11101025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  {$}}
11201025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^    i = 12;$}}
11301025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  }$}}
11401025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  i = 13;$}}
11501025dddSPiotr Zegar 
11601025dddSPiotr Zegar   i = 14;
11701025dddSPiotr Zegar   if (!false) {
11801025dddSPiotr Zegar     i = 15;
11901025dddSPiotr Zegar   } else {
12001025dddSPiotr Zegar     i = 16;
12101025dddSPiotr Zegar   }
12201025dddSPiotr Zegar   i = 17;
12301025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition
12401025dddSPiotr Zegar   // CHECK-FIXES:      {{^  i = 14;$}}
12501025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  {$}}
12601025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^    i = 15;$}}
12701025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  }$}}
12801025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  i = 17;$}}
12901025dddSPiotr Zegar 
13001025dddSPiotr Zegar   i = 18;
13101025dddSPiotr Zegar   if (!true) {
13201025dddSPiotr Zegar     i = 19;
13301025dddSPiotr Zegar   }
13401025dddSPiotr Zegar   i = 20;
13501025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition
13601025dddSPiotr Zegar   // CHECK-FIXES:      {{^  i = 18;$}}
13701025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  $}}
13801025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^  i = 20;$}}
13901025dddSPiotr Zegar }
14001025dddSPiotr Zegar 
operator_equals()14101025dddSPiotr Zegar void operator_equals() {
14201025dddSPiotr Zegar   int i = 0;
14301025dddSPiotr Zegar   bool b1 = (i > 2);
14401025dddSPiotr Zegar   if (b1 == true) {
14501025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
14601025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(b1\) {$}}
14701025dddSPiotr Zegar     i = 5;
14801025dddSPiotr Zegar   } else {
14901025dddSPiotr Zegar     i = 6;
15001025dddSPiotr Zegar   }
15101025dddSPiotr Zegar   bool b2 = (i > 4);
15201025dddSPiotr Zegar   if (b2 == false) {
15301025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
15401025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(!b2\) {$}}
15501025dddSPiotr Zegar     i = 7;
15601025dddSPiotr Zegar   } else {
15701025dddSPiotr Zegar     i = 9;
15801025dddSPiotr Zegar   }
15901025dddSPiotr Zegar   bool b3 = (i > 6);
16001025dddSPiotr Zegar   if (true == b3) {
16101025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
16201025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(b3\) {$}}
16301025dddSPiotr Zegar     i = 10;
16401025dddSPiotr Zegar   } else {
16501025dddSPiotr Zegar     i = 11;
16601025dddSPiotr Zegar   }
16701025dddSPiotr Zegar   bool b4 = (i > 8);
16801025dddSPiotr Zegar   if (false == b4) {
16901025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
17001025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(!b4\) {$}}
17101025dddSPiotr Zegar     i = 12;
17201025dddSPiotr Zegar   } else {
17301025dddSPiotr Zegar     i = 13;
17401025dddSPiotr Zegar   }
17501025dddSPiotr Zegar }
17601025dddSPiotr Zegar 
operator_or()17701025dddSPiotr Zegar void operator_or() {
17801025dddSPiotr Zegar   int i = 0;
17901025dddSPiotr Zegar   bool b5 = (i > 10);
18001025dddSPiotr Zegar   if (b5 || false) {
18101025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
18201025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(b5\) {$}}
18301025dddSPiotr Zegar     i = 14;
18401025dddSPiotr Zegar   } else {
18501025dddSPiotr Zegar     i = 15;
18601025dddSPiotr Zegar   }
18701025dddSPiotr Zegar   bool b6 = (i > 10);
18801025dddSPiotr Zegar   if (b6 || true) {
18901025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
19001025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(true\) {$}}
19101025dddSPiotr Zegar     i = 16;
19201025dddSPiotr Zegar   } else {
19301025dddSPiotr Zegar     i = 17;
19401025dddSPiotr Zegar   }
19501025dddSPiotr Zegar   bool b7 = (i > 10);
19601025dddSPiotr Zegar   if (false || b7) {
19701025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
19801025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(b7\) {$}}
19901025dddSPiotr Zegar     i = 18;
20001025dddSPiotr Zegar   } else {
20101025dddSPiotr Zegar     i = 19;
20201025dddSPiotr Zegar   }
20301025dddSPiotr Zegar   bool b8 = (i > 10);
20401025dddSPiotr Zegar   if (true || b8) {
20501025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
20601025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(true\) {$}}
20701025dddSPiotr Zegar     i = 20;
20801025dddSPiotr Zegar   } else {
20901025dddSPiotr Zegar     i = 21;
21001025dddSPiotr Zegar   }
21101025dddSPiotr Zegar }
21201025dddSPiotr Zegar 
operator_and()21301025dddSPiotr Zegar void operator_and() {
21401025dddSPiotr Zegar   int i = 0;
21501025dddSPiotr Zegar   bool b9 = (i > 20);
21601025dddSPiotr Zegar   if (b9 && false) {
21701025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
21801025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(false\) {$}}
21901025dddSPiotr Zegar     i = 22;
22001025dddSPiotr Zegar   } else {
22101025dddSPiotr Zegar     i = 23;
22201025dddSPiotr Zegar   }
22301025dddSPiotr Zegar   bool ba = (i > 20);
22401025dddSPiotr Zegar   if (ba && true) {
22501025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
22601025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(ba\) {$}}
22701025dddSPiotr Zegar     i = 24;
22801025dddSPiotr Zegar   } else {
22901025dddSPiotr Zegar     i = 25;
23001025dddSPiotr Zegar   }
23101025dddSPiotr Zegar   bool bb = (i > 20);
23201025dddSPiotr Zegar   if (false && bb) {
23301025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
23401025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(false\) {$}}
23501025dddSPiotr Zegar     i = 26;
23601025dddSPiotr Zegar   } else {
23701025dddSPiotr Zegar     i = 27;
23801025dddSPiotr Zegar   }
23901025dddSPiotr Zegar   bool bc = (i > 20);
24001025dddSPiotr Zegar   if (true && bc) {
24101025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
24201025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(bc\) {$}}
24301025dddSPiotr Zegar     i = 28;
24401025dddSPiotr Zegar   } else {
24501025dddSPiotr Zegar     i = 29;
24601025dddSPiotr Zegar   }
24701025dddSPiotr Zegar }
24801025dddSPiotr Zegar 
ternary_operator()24901025dddSPiotr Zegar void ternary_operator() {
25001025dddSPiotr Zegar   int i = 0;
25101025dddSPiotr Zegar   bool bd = (i > 20) ? true : false;
25201025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result
25301025dddSPiotr Zegar   // CHECK-FIXES: {{^  bool bd = i > 20;$}}
25401025dddSPiotr Zegar 
25501025dddSPiotr Zegar   bool be = (i > 20) ? false : true;
25601025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result
25701025dddSPiotr Zegar   // CHECK-FIXES: {{^  bool be = i <= 20;$}}
25801025dddSPiotr Zegar 
25901025dddSPiotr Zegar   bool bf = ((i > 20)) ? false : true;
26001025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: {{.*}} in ternary expression result
26101025dddSPiotr Zegar   // CHECK-FIXES: {{^  bool bf = i <= 20;$}}
26201025dddSPiotr Zegar }
26301025dddSPiotr Zegar 
operator_not_equal()26401025dddSPiotr Zegar void operator_not_equal() {
26501025dddSPiotr Zegar   int i = 0;
26601025dddSPiotr Zegar   bool bf = (i > 20);
26701025dddSPiotr Zegar   if (false != bf) {
26801025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
26901025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(bf\) {$}}
27001025dddSPiotr Zegar     i = 30;
27101025dddSPiotr Zegar   } else {
27201025dddSPiotr Zegar     i = 31;
27301025dddSPiotr Zegar   }
27401025dddSPiotr Zegar   bool bg = (i > 20);
27501025dddSPiotr Zegar   if (true != bg) {
27601025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator
27701025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(!bg\) {$}}
27801025dddSPiotr Zegar     i = 32;
27901025dddSPiotr Zegar   } else {
28001025dddSPiotr Zegar     i = 33;
28101025dddSPiotr Zegar   }
28201025dddSPiotr Zegar   bool bh = (i > 20);
28301025dddSPiotr Zegar   if (bh != false) {
28401025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
28501025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(bh\) {$}}
28601025dddSPiotr Zegar     i = 34;
28701025dddSPiotr Zegar   } else {
28801025dddSPiotr Zegar     i = 35;
28901025dddSPiotr Zegar   }
29001025dddSPiotr Zegar   bool bi = (i > 20);
29101025dddSPiotr Zegar   if (bi != true) {
29201025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator
29301025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(!bi\) {$}}
29401025dddSPiotr Zegar     i = 36;
29501025dddSPiotr Zegar   } else {
29601025dddSPiotr Zegar     i = 37;
29701025dddSPiotr Zegar   }
29801025dddSPiotr Zegar }
29901025dddSPiotr Zegar 
nested_booleans()30001025dddSPiotr Zegar void nested_booleans() {
30101025dddSPiotr Zegar   if (false || (true || false)) {
30201025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
30301025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(false \|\| \(true\)\) {$}}
30401025dddSPiotr Zegar   }
30501025dddSPiotr Zegar   if (true && (true || false)) {
30601025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator
30701025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(true && \(true\)\) {$}}
30801025dddSPiotr Zegar   }
30901025dddSPiotr Zegar   if (false || (true && false)) {
31001025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator
31101025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(false \|\| \(false\)\) {$}}
31201025dddSPiotr Zegar   }
31301025dddSPiotr Zegar   if (true && (true && false)) {
31401025dddSPiotr Zegar     // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator
31501025dddSPiotr Zegar     // CHECK-FIXES: {{^  if \(true && \(false\)\) {$}}
31601025dddSPiotr Zegar   }
31701025dddSPiotr Zegar }
31801025dddSPiotr Zegar 
truthy()31901025dddSPiotr Zegar static constexpr bool truthy() {
32001025dddSPiotr Zegar   return true;
32101025dddSPiotr Zegar }
32201025dddSPiotr Zegar 
32301025dddSPiotr Zegar #define HAS_XYZ_FEATURE true
32401025dddSPiotr Zegar #define M1(what) M2(true, what)
32501025dddSPiotr Zegar #define M2(condition, what) if (condition) what
32601025dddSPiotr Zegar 
macros_and_constexprs(int i=0)32701025dddSPiotr Zegar void macros_and_constexprs(int i = 0) {
32801025dddSPiotr Zegar   bool b = (i == 1);
32901025dddSPiotr Zegar   if (b && truthy()) {
33001025dddSPiotr Zegar     // leave this alone; if you want it simplified, then you should
33101025dddSPiotr Zegar     // inline the constexpr function first.
33201025dddSPiotr Zegar     i = 1;
33301025dddSPiotr Zegar   }
33401025dddSPiotr Zegar   i = 2;
33501025dddSPiotr Zegar   if (b && HAS_XYZ_FEATURE) {
33601025dddSPiotr Zegar     // leave this alone; if you want it simplified, then you should
33701025dddSPiotr Zegar     // inline the macro first.
33801025dddSPiotr Zegar     i = 3;
33901025dddSPiotr Zegar   }
34001025dddSPiotr Zegar   if (HAS_XYZ_FEATURE) {
34101025dddSPiotr Zegar     i = 5;
34201025dddSPiotr Zegar   }
34301025dddSPiotr Zegar   i = 4;
34401025dddSPiotr Zegar   M1(i = 7);
34501025dddSPiotr Zegar }
34601025dddSPiotr Zegar 
34701025dddSPiotr Zegar #undef HAS_XYZ_FEATURE
34801025dddSPiotr Zegar 
conditional_return_statements(int i)34901025dddSPiotr Zegar bool conditional_return_statements(int i) {
35001025dddSPiotr Zegar   if (i == 0) return true; else return false;
35101025dddSPiotr Zegar }
35201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement
35301025dddSPiotr Zegar // CHECK-FIXES:      {{^}}  return i == 0;{{$}}
35401025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}$}}
35501025dddSPiotr Zegar 
conditional_return_statements_no_fix_1(int i)356*e6979432SCongcong Cai bool conditional_return_statements_no_fix_1(int i) {
357*e6979432SCongcong Cai   if (i == 0) return true;
358*e6979432SCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}} in conditional return statement
359*e6979432SCongcong Cai   // CHECK-MESSAGES: :[[@LINE-2]]:7: note: conditions that can be simplified
360*e6979432SCongcong Cai   // comment
361*e6979432SCongcong Cai   return false;
362*e6979432SCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: note: return statement that can be simplified
363*e6979432SCongcong Cai }
364*e6979432SCongcong Cai 
conditional_return_statements_no_fix_2(int i)365*e6979432SCongcong Cai bool conditional_return_statements_no_fix_2(int i) {
366*e6979432SCongcong Cai   if (i == 0) return true;
367*e6979432SCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}} in conditional return statement
368*e6979432SCongcong Cai   // CHECK-MESSAGES: :[[@LINE-2]]:7: note: conditions that can be simplified
369*e6979432SCongcong Cai   // comment
370*e6979432SCongcong Cai   else return false;
371*e6979432SCongcong Cai }
372*e6979432SCongcong Cai 
conditional_return_statements_then_expr(int i,int j)37301025dddSPiotr Zegar bool conditional_return_statements_then_expr(int i, int j) {
37401025dddSPiotr Zegar   if (i == j) return (i == 0); else return false;
37501025dddSPiotr Zegar }
37601025dddSPiotr Zegar 
conditional_return_statements_else_expr(int i,int j)37701025dddSPiotr Zegar bool conditional_return_statements_else_expr(int i, int j) {
37801025dddSPiotr Zegar   if (i == j) return true; else return (i == 0);
37901025dddSPiotr Zegar }
38001025dddSPiotr Zegar 
negated_conditional_return_statements(int i)38101025dddSPiotr Zegar bool negated_conditional_return_statements(int i) {
38201025dddSPiotr Zegar   if (i == 0) return false; else return true;
38301025dddSPiotr Zegar }
38401025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement
38501025dddSPiotr Zegar // CHECK-FIXES:      {{^}}  return i != 0;{{$}}
38601025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}$}}
38701025dddSPiotr Zegar 
negative_condition_conditional_return_statement(int i)38801025dddSPiotr Zegar bool negative_condition_conditional_return_statement(int i) {
38901025dddSPiotr Zegar   if (!(i == 0)) return false; else return true;
39001025dddSPiotr Zegar }
39101025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: {{.*}} in conditional return statement
39201025dddSPiotr Zegar // CHECK-FIXES:      {{^}}  return i == 0;{{$}}
39301025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}$}}
39401025dddSPiotr Zegar 
conditional_compound_return_statements(int i)39501025dddSPiotr Zegar bool conditional_compound_return_statements(int i) {
39601025dddSPiotr Zegar   if (i == 1) {
39701025dddSPiotr Zegar     return true;
39801025dddSPiotr Zegar   } else {
39901025dddSPiotr Zegar     return false;
40001025dddSPiotr Zegar   }
40101025dddSPiotr Zegar }
40201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement
40301025dddSPiotr Zegar // CHECK-FIXES:      {{^}}bool conditional_compound_return_statements(int i) {{{$}}
40401025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}}  return i == 1;{{$}}
40501025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}$}}
40601025dddSPiotr Zegar 
negated_conditional_compound_return_statements(int i)40701025dddSPiotr Zegar bool negated_conditional_compound_return_statements(int i) {
40801025dddSPiotr Zegar   if (i == 1) {
40901025dddSPiotr Zegar     return false;
41001025dddSPiotr Zegar   } else {
41101025dddSPiotr Zegar     return true;
41201025dddSPiotr Zegar   }
41301025dddSPiotr Zegar }
41401025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement
41501025dddSPiotr Zegar // CHECK-FIXES:      {{^}}bool negated_conditional_compound_return_statements(int i) {{{$}}
41601025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}}  return i != 1;{{$}}
41701025dddSPiotr Zegar // CHECK-FIXES-NEXT: {{^}$}}
41801025dddSPiotr Zegar 
conditional_return_statements_side_effects_then(int i)41901025dddSPiotr Zegar bool conditional_return_statements_side_effects_then(int i) {
42001025dddSPiotr Zegar   if (i == 2) {
42101025dddSPiotr Zegar     macros_and_constexprs();
42201025dddSPiotr Zegar     return true;
42301025dddSPiotr Zegar   } else
42401025dddSPiotr Zegar     return false;
42501025dddSPiotr Zegar }
42601025dddSPiotr Zegar 
negated_conditional_return_statements_side_effects_then(int i)42701025dddSPiotr Zegar bool negated_conditional_return_statements_side_effects_then(int i) {
42801025dddSPiotr Zegar   if (i == 2) {
42901025dddSPiotr Zegar     macros_and_constexprs();
43001025dddSPiotr Zegar     return false;
43101025dddSPiotr Zegar   } else
43201025dddSPiotr Zegar     return true;
43301025dddSPiotr Zegar }
43401025dddSPiotr Zegar 
conditional_return_statements_side_effects_else(int i)43501025dddSPiotr Zegar bool conditional_return_statements_side_effects_else(int i) {
43601025dddSPiotr Zegar   if (i == 2)
43701025dddSPiotr Zegar     return true;
43801025dddSPiotr Zegar   else {
43901025dddSPiotr Zegar     macros_and_constexprs();
44001025dddSPiotr Zegar     return false;
44101025dddSPiotr Zegar   }
44201025dddSPiotr Zegar }
44301025dddSPiotr Zegar 
negated_conditional_return_statements_side_effects_else(int i)44401025dddSPiotr Zegar bool negated_conditional_return_statements_side_effects_else(int i) {
44501025dddSPiotr Zegar   if (i == 2)
44601025dddSPiotr Zegar     return false;
44701025dddSPiotr Zegar   else {
44801025dddSPiotr Zegar     macros_and_constexprs();
44901025dddSPiotr Zegar     return true;
45001025dddSPiotr Zegar   }
45101025dddSPiotr Zegar }
45201025dddSPiotr Zegar 
lambda_conditional_return_statements()45301025dddSPiotr Zegar void lambda_conditional_return_statements() {
45401025dddSPiotr Zegar   auto lambda = [](int n) -> bool { if (n > 0) return true; else return false; };
45501025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-1]]:55: warning: {{.*}} in conditional return statement
45601025dddSPiotr Zegar   // CHECK-FIXES: {{^}}  auto lambda = [](int n) -> bool { return n > 0; };{{$}}
45701025dddSPiotr Zegar 
45801025dddSPiotr Zegar   auto lambda2 = [](int n) -> bool {
45901025dddSPiotr Zegar     if (n > 0) {
46001025dddSPiotr Zegar         return true;
46101025dddSPiotr Zegar     } else {
46201025dddSPiotr Zegar         return false;
46301025dddSPiotr Zegar     }
46401025dddSPiotr Zegar   };
46501025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-5]]:16: warning: {{.*}} in conditional return statement
46601025dddSPiotr Zegar   // CHECK-FIXES:      {{^}}  auto lambda2 = [](int n) -> bool {{{$}}
46701025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^}}    return n > 0;{{$}}
46801025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^}}  };{{$}}
46901025dddSPiotr Zegar 
47001025dddSPiotr Zegar   auto lambda3 = [](int n) -> bool { if (n > 0) {macros_and_constexprs(); return true; } else return false; };
47101025dddSPiotr Zegar 
47201025dddSPiotr Zegar   auto lambda4 = [](int n) -> bool {
47301025dddSPiotr Zegar     if (n > 0)
47401025dddSPiotr Zegar         return true;
47501025dddSPiotr Zegar     else {
47601025dddSPiotr Zegar         macros_and_constexprs();
47701025dddSPiotr Zegar         return false;
47801025dddSPiotr Zegar     }
47901025dddSPiotr Zegar   };
48001025dddSPiotr Zegar 
48101025dddSPiotr Zegar   auto lambda5 = [](int n) -> bool { if (n > 0) return false; else return true; };
48201025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: {{.*}} in conditional return statement
48301025dddSPiotr Zegar   // CHECK-FIXES: {{^}}  auto lambda5 = [](int n) -> bool { return n <= 0; };{{$}}
48401025dddSPiotr Zegar 
48501025dddSPiotr Zegar   auto lambda6 = [](int n) -> bool {
48601025dddSPiotr Zegar     if (n > 0) {
48701025dddSPiotr Zegar         return false;
48801025dddSPiotr Zegar     } else {
48901025dddSPiotr Zegar         return true;
49001025dddSPiotr Zegar     }
49101025dddSPiotr Zegar   };
49201025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-5]]:16: warning: {{.*}} in conditional return statement
49301025dddSPiotr Zegar   // CHECK-FIXES:      {{^}}  auto lambda6 = [](int n) -> bool {{{$}}
49401025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^}}    return n <= 0;{{$}}
49501025dddSPiotr Zegar   // CHECK-FIXES-NEXT: {{^}}  };{{$}}
49601025dddSPiotr Zegar }
49701025dddSPiotr Zegar 
condition_variable_return_stmt(int i)49801025dddSPiotr Zegar bool condition_variable_return_stmt(int i) {
49901025dddSPiotr Zegar   // Unchanged: condition variable.
50001025dddSPiotr Zegar   if (bool Res = i == 0)
50101025dddSPiotr Zegar     return true;
50201025dddSPiotr Zegar   else
50301025dddSPiotr Zegar     return false;
50401025dddSPiotr Zegar }
50501025dddSPiotr Zegar 
simple_conditional_assignment_statements(int i)50601025dddSPiotr Zegar void simple_conditional_assignment_statements(int i) {
50701025dddSPiotr Zegar   bool b;
50801025dddSPiotr Zegar   if (i > 10)
50901025dddSPiotr Zegar     b = true;
51001025dddSPiotr Zegar   else
51101025dddSPiotr Zegar     b = false;
51201025dddSPiotr Zegar   bool bb = false;
51301025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment
51401025dddSPiotr Zegar   // CHECK-FIXES: bool b;
51501025dddSPiotr Zegar   // CHECK-FIXES: {{^  }}b = i > 10;{{$}}
51601025dddSPiotr Zegar   // CHECK-FIXES: bool bb = false;
51701025dddSPiotr Zegar 
51801025dddSPiotr Zegar   bool c;
51901025dddSPiotr Zegar   if (i > 20)
52001025dddSPiotr Zegar     c = false;
52101025dddSPiotr Zegar   else
52201025dddSPiotr Zegar     c = true;
52301025dddSPiotr Zegar   bool c2 = false;
52401025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment
52501025dddSPiotr Zegar   // CHECK-FIXES: bool c;
52601025dddSPiotr Zegar   // CHECK-FIXES: {{^  }}c = i <= 20;{{$}}
52701025dddSPiotr Zegar   // CHECK-FIXES: bool c2 = false;
52801025dddSPiotr Zegar 
52901025dddSPiotr Zegar   // Unchanged: different variables.
53001025dddSPiotr Zegar   bool b2;
53101025dddSPiotr Zegar   if (i > 12)
53201025dddSPiotr Zegar     b = true;
53301025dddSPiotr Zegar   else
53401025dddSPiotr Zegar     b2 = false;
53501025dddSPiotr Zegar 
53601025dddSPiotr Zegar   // Unchanged: no else statement.
53701025dddSPiotr Zegar   bool b3;
53801025dddSPiotr Zegar   if (i > 15)
53901025dddSPiotr Zegar     b3 = true;
54001025dddSPiotr Zegar 
54101025dddSPiotr Zegar   // Unchanged: not boolean assignment.
54201025dddSPiotr Zegar   int j;
54301025dddSPiotr Zegar   if (i > 17)
54401025dddSPiotr Zegar     j = 10;
54501025dddSPiotr Zegar   else
54601025dddSPiotr Zegar     j = 20;
54701025dddSPiotr Zegar 
54801025dddSPiotr Zegar   // Unchanged: different variables assigned.
54901025dddSPiotr Zegar   int k = 0;
55001025dddSPiotr Zegar   bool b4 = false;
55101025dddSPiotr Zegar   if (i > 10)
55201025dddSPiotr Zegar     b4 = true;
55301025dddSPiotr Zegar   else
55401025dddSPiotr Zegar     k = 10;
55501025dddSPiotr Zegar }
55601025dddSPiotr Zegar 
complex_conditional_assignment_statements(int i)55701025dddSPiotr Zegar void complex_conditional_assignment_statements(int i) {
55801025dddSPiotr Zegar   bool d;
55901025dddSPiotr Zegar   if (i > 30) {
56001025dddSPiotr Zegar     d = true;
56101025dddSPiotr Zegar   } else {
56201025dddSPiotr Zegar     d = false;
56301025dddSPiotr Zegar   }
56401025dddSPiotr Zegar   d = false;
56501025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment
56601025dddSPiotr Zegar   // CHECK-FIXES: bool d;
56701025dddSPiotr Zegar   // CHECK-FIXES: {{^  }}d = i > 30;{{$}}
56801025dddSPiotr Zegar   // CHECK-FIXES: d = false;
56901025dddSPiotr Zegar 
57001025dddSPiotr Zegar   bool e;
57101025dddSPiotr Zegar   if (i > 40) {
57201025dddSPiotr Zegar     e = false;
57301025dddSPiotr Zegar   } else {
57401025dddSPiotr Zegar     e = true;
57501025dddSPiotr Zegar   }
57601025dddSPiotr Zegar   e = false;
57701025dddSPiotr Zegar   // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment
57801025dddSPiotr Zegar   // CHECK-FIXES: bool e;
57901025dddSPiotr Zegar   // CHECK-FIXES: {{^  }}e = i <= 40;{{$}}
58001025dddSPiotr Zegar   // CHECK-FIXES: e = false;
58101025dddSPiotr Zegar 
58201025dddSPiotr Zegar   // Unchanged: no else statement.
58301025dddSPiotr Zegar   bool b3;
58401025dddSPiotr Zegar   if (i > 15) {
58501025dddSPiotr Zegar     b3 = true;
58601025dddSPiotr Zegar   }
58701025dddSPiotr Zegar 
58801025dddSPiotr Zegar   // Unchanged: not a boolean assignment.
58901025dddSPiotr Zegar   int j;
59001025dddSPiotr Zegar   if (i > 17) {
59101025dddSPiotr Zegar     j = 10;
59201025dddSPiotr Zegar   } else {
59301025dddSPiotr Zegar     j = 20;
59401025dddSPiotr Zegar   }
59501025dddSPiotr Zegar 
59601025dddSPiotr Zegar   // Unchanged: multiple statements.
59701025dddSPiotr Zegar   bool f;
59801025dddSPiotr Zegar   if (j > 10) {
59901025dddSPiotr Zegar     j = 10;
60001025dddSPiotr Zegar     f = true;
60101025dddSPiotr Zegar   } else {
60201025dddSPiotr Zegar     j = 20;
60301025dddSPiotr Zegar     f = false;
60401025dddSPiotr Zegar   }
60501025dddSPiotr Zegar 
60601025dddSPiotr Zegar   // Unchanged: multiple statements.
60701025dddSPiotr Zegar   bool g;
60801025dddSPiotr Zegar   if (j > 10)
60901025dddSPiotr Zegar     g = true;
61001025dddSPiotr Zegar   else {
61101025dddSPiotr Zegar     j = 20;
61201025dddSPiotr Zegar     g = false;
61301025dddSPiotr Zegar   }
61401025dddSPiotr Zegar 
61501025dddSPiotr Zegar   // Unchanged: multiple statements.
61601025dddSPiotr Zegar   bool h;
61701025dddSPiotr Zegar   if (j > 10) {
61801025dddSPiotr Zegar     j = 10;
61901025dddSPiotr Zegar     h = true;
62001025dddSPiotr Zegar   } else
62101025dddSPiotr Zegar     h = false;
62201025dddSPiotr Zegar 
62301025dddSPiotr Zegar   // Unchanged: condition variable.
62401025dddSPiotr Zegar   bool k;
62501025dddSPiotr Zegar   if (bool Res = j > 10)
62601025dddSPiotr Zegar     k = true;
62701025dddSPiotr Zegar   else
62801025dddSPiotr Zegar     k = false;
62901025dddSPiotr Zegar }
63001025dddSPiotr Zegar 
63101025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
chained_conditional_compound_return(int i)63201025dddSPiotr Zegar bool chained_conditional_compound_return(int i) {
63301025dddSPiotr Zegar   if (i < 0) {
63401025dddSPiotr Zegar     return true;
63501025dddSPiotr Zegar   } else if (i < 10) {
63601025dddSPiotr Zegar     return false;
63701025dddSPiotr Zegar   } else if (i > 20) {
63801025dddSPiotr Zegar     return true;
63901025dddSPiotr Zegar   } else {
64001025dddSPiotr Zegar     return false;
64101025dddSPiotr Zegar   }
64201025dddSPiotr Zegar }
64301025dddSPiotr Zegar 
64401025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
chained_conditional_return(int i)64501025dddSPiotr Zegar bool chained_conditional_return(int i) {
64601025dddSPiotr Zegar   if (i < 0)
64701025dddSPiotr Zegar     return true;
64801025dddSPiotr Zegar   else if (i < 10)
64901025dddSPiotr Zegar     return false;
65001025dddSPiotr Zegar   else if (i > 20)
65101025dddSPiotr Zegar     return true;
65201025dddSPiotr Zegar   else
65301025dddSPiotr Zegar     return false;
65401025dddSPiotr Zegar }
65501025dddSPiotr Zegar 
65601025dddSPiotr Zegar // Unchanged: chained assignments, but ChainedConditionalAssignment not set.
chained_conditional_compound_assignment(int i)65701025dddSPiotr Zegar void chained_conditional_compound_assignment(int i) {
65801025dddSPiotr Zegar   bool b;
65901025dddSPiotr Zegar   if (i < 0) {
66001025dddSPiotr Zegar     b = true;
66101025dddSPiotr Zegar   } else if (i < 10) {
66201025dddSPiotr Zegar     b = false;
66301025dddSPiotr Zegar   } else if (i > 20) {
66401025dddSPiotr Zegar     b = true;
66501025dddSPiotr Zegar   } else {
66601025dddSPiotr Zegar     b = false;
66701025dddSPiotr Zegar   }
66801025dddSPiotr Zegar }
66901025dddSPiotr Zegar 
67001025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
chained_conditional_assignment(int i)67101025dddSPiotr Zegar void chained_conditional_assignment(int i) {
67201025dddSPiotr Zegar   bool b;
67301025dddSPiotr Zegar   if (i < 0)
67401025dddSPiotr Zegar     b = true;
67501025dddSPiotr Zegar   else if (i < 10)
67601025dddSPiotr Zegar     b = false;
67701025dddSPiotr Zegar   else if (i > 20)
67801025dddSPiotr Zegar     b = true;
67901025dddSPiotr Zegar   else
68001025dddSPiotr Zegar     b = false;
68101025dddSPiotr Zegar }
68201025dddSPiotr Zegar 
68301025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
chained_simple_if_return_negated(int i)68401025dddSPiotr Zegar bool chained_simple_if_return_negated(int i) {
68501025dddSPiotr Zegar   if (i < 5)
68601025dddSPiotr Zegar     return false;
68701025dddSPiotr Zegar   if (i > 10)
68801025dddSPiotr Zegar     return false;
68901025dddSPiotr Zegar   return true;
69001025dddSPiotr Zegar }
69101025dddSPiotr Zegar 
69201025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
complex_chained_if_return_return(int i)69301025dddSPiotr Zegar bool complex_chained_if_return_return(int i) {
69401025dddSPiotr Zegar   if (i < 5) {
69501025dddSPiotr Zegar     return true;
69601025dddSPiotr Zegar   }
69701025dddSPiotr Zegar   if (i > 10) {
69801025dddSPiotr Zegar     return true;
69901025dddSPiotr Zegar   }
70001025dddSPiotr Zegar   return false;
70101025dddSPiotr Zegar }
70201025dddSPiotr Zegar 
70301025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
complex_chained_if_return_return_negated(int i)70401025dddSPiotr Zegar bool complex_chained_if_return_return_negated(int i) {
70501025dddSPiotr Zegar   if (i < 5) {
70601025dddSPiotr Zegar     return false;
70701025dddSPiotr Zegar   }
70801025dddSPiotr Zegar   if (i > 10) {
70901025dddSPiotr Zegar     return false;
71001025dddSPiotr Zegar   }
71101025dddSPiotr Zegar   return true;
71201025dddSPiotr Zegar }
71301025dddSPiotr Zegar 
71401025dddSPiotr Zegar // Unchanged: chained return statements, but ChainedConditionalReturn not set.
chained_simple_if_return(int i)71501025dddSPiotr Zegar bool chained_simple_if_return(int i) {
71601025dddSPiotr Zegar   if (i < 5)
71701025dddSPiotr Zegar     return true;
71801025dddSPiotr Zegar   if (i > 10)
71901025dddSPiotr Zegar     return true;
72001025dddSPiotr Zegar   return false;
72101025dddSPiotr Zegar }
72201025dddSPiotr Zegar 
simple_if_return_return(int i)72301025dddSPiotr Zegar bool simple_if_return_return(int i) {
72401025dddSPiotr Zegar   if (i > 10)
72501025dddSPiotr Zegar     return true;
72601025dddSPiotr Zegar   return false;
72701025dddSPiotr Zegar }
72801025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return
72901025dddSPiotr Zegar // CHECK-FIXES: {{^}}bool simple_if_return_return(int i) {{{$}}
73001025dddSPiotr Zegar // CHECK-FIXES: {{^  return i > 10;$}}
73101025dddSPiotr Zegar // CHECK-FIXES: {{^}$}}
73201025dddSPiotr Zegar 
simple_if_return_return_negated(int i)73301025dddSPiotr Zegar bool simple_if_return_return_negated(int i) {
73401025dddSPiotr Zegar   if (i > 10)
73501025dddSPiotr Zegar     return false;
73601025dddSPiotr Zegar   return true;
73701025dddSPiotr Zegar }
73801025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return
73901025dddSPiotr Zegar // CHECK-FIXES: {{^}}bool simple_if_return_return_negated(int i) {{{$}}
74001025dddSPiotr Zegar // CHECK-FIXES: {{^  return i <= 10;$}}
74101025dddSPiotr Zegar // CHECK-FIXES: {{^}$}}
74201025dddSPiotr Zegar 
complex_if_return_return(int i)74301025dddSPiotr Zegar bool complex_if_return_return(int i) {
74401025dddSPiotr Zegar   if (i > 10) {
74501025dddSPiotr Zegar     return true;
74601025dddSPiotr Zegar   }
74701025dddSPiotr Zegar   return false;
74801025dddSPiotr Zegar }
74901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return
75001025dddSPiotr Zegar // CHECK-FIXES: {{^}}bool complex_if_return_return(int i) {{{$}}
75101025dddSPiotr Zegar // CHECK-FIXES: {{^  return i > 10;$}}
75201025dddSPiotr Zegar // CHECK-FIXES: {{^}$}}
75301025dddSPiotr Zegar 
complex_if_return_return_negated(int i)75401025dddSPiotr Zegar bool complex_if_return_return_negated(int i) {
75501025dddSPiotr Zegar   if (i > 10) {
75601025dddSPiotr Zegar     return false;
75701025dddSPiotr Zegar   }
75801025dddSPiotr Zegar   return true;
75901025dddSPiotr Zegar }
76001025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return
76101025dddSPiotr Zegar // CHECK-FIXES: {{^}}bool complex_if_return_return_negated(int i) {{{$}}
76201025dddSPiotr Zegar // CHECK-FIXES: {{^  return i <= 10;$}}
76301025dddSPiotr Zegar // CHECK-FIXES: {{^}$}}
76401025dddSPiotr Zegar 
if_implicit_bool_expr(int i)76501025dddSPiotr Zegar bool if_implicit_bool_expr(int i) {
76601025dddSPiotr Zegar   if (i & 1) {
76701025dddSPiotr Zegar     return true;
76801025dddSPiotr Zegar   } else {
76901025dddSPiotr Zegar     return false;
77001025dddSPiotr Zegar   }
77101025dddSPiotr Zegar }
77201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
77301025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return (i & 1) != 0;{{$}}
77401025dddSPiotr Zegar 
negated_if_implicit_bool_expr(int i)77501025dddSPiotr Zegar bool negated_if_implicit_bool_expr(int i) {
77601025dddSPiotr Zegar   if (i - 1) {
77701025dddSPiotr Zegar     return false;
77801025dddSPiotr Zegar   } else {
77901025dddSPiotr Zegar     return true;
78001025dddSPiotr Zegar   }
78101025dddSPiotr Zegar }
78201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
78301025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return (i - 1) == 0;{{$}}
78401025dddSPiotr Zegar 
implicit_int(int i)78501025dddSPiotr Zegar bool implicit_int(int i) {
78601025dddSPiotr Zegar   if (i) {
78701025dddSPiotr Zegar     return true;
78801025dddSPiotr Zegar   } else {
78901025dddSPiotr Zegar     return false;
79001025dddSPiotr Zegar   }
79101025dddSPiotr Zegar }
79201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
79301025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return i != 0;{{$}}
79401025dddSPiotr Zegar 
explicit_bool(bool b)79501025dddSPiotr Zegar bool explicit_bool(bool b) {
79601025dddSPiotr Zegar   if (b) {
79701025dddSPiotr Zegar     return true;
79801025dddSPiotr Zegar   } else {
79901025dddSPiotr Zegar     return false;
80001025dddSPiotr Zegar   }
80101025dddSPiotr Zegar }
80201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
80301025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return b;{{$}}
80401025dddSPiotr Zegar 
80501025dddSPiotr Zegar class Implicit {
80601025dddSPiotr Zegar public:
operator bool()80701025dddSPiotr Zegar   operator bool() {
80801025dddSPiotr Zegar     return true;
80901025dddSPiotr Zegar   }
81001025dddSPiotr Zegar };
81101025dddSPiotr Zegar 
object_bool_implicit_conversion(Implicit O)81201025dddSPiotr Zegar bool object_bool_implicit_conversion(Implicit O) {
81301025dddSPiotr Zegar   if (O) {
81401025dddSPiotr Zegar     return true;
81501025dddSPiotr Zegar   } else {
81601025dddSPiotr Zegar     return false;
81701025dddSPiotr Zegar   }
81801025dddSPiotr Zegar }
81901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
82001025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return O;{{$}}
82101025dddSPiotr Zegar 
negated_explicit_bool(bool b)82201025dddSPiotr Zegar bool negated_explicit_bool(bool b) {
82301025dddSPiotr Zegar   if (!b) {
82401025dddSPiotr Zegar     return true;
82501025dddSPiotr Zegar   } else {
82601025dddSPiotr Zegar     return false;
82701025dddSPiotr Zegar   }
82801025dddSPiotr Zegar }
82901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
83001025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return !b;{{$}}
83101025dddSPiotr Zegar 
bitwise_complement_conversion(int i)83201025dddSPiotr Zegar bool bitwise_complement_conversion(int i) {
83301025dddSPiotr Zegar   if (~i) {
83401025dddSPiotr Zegar     return true;
83501025dddSPiotr Zegar   } else {
83601025dddSPiotr Zegar     return false;
83701025dddSPiotr Zegar   }
83801025dddSPiotr Zegar }
83901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
84001025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return ~i != 0;{{$}}
84101025dddSPiotr Zegar 
logical_or(bool a,bool b)84201025dddSPiotr Zegar bool logical_or(bool a, bool b) {
84301025dddSPiotr Zegar   if (a || b) {
84401025dddSPiotr Zegar     return true;
84501025dddSPiotr Zegar   } else {
84601025dddSPiotr Zegar     return false;
84701025dddSPiotr Zegar   }
84801025dddSPiotr Zegar }
84901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
85001025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return a || b;{{$}}
85101025dddSPiotr Zegar 
logical_and(bool a,bool b)85201025dddSPiotr Zegar bool logical_and(bool a, bool b) {
85301025dddSPiotr Zegar   if (a && b) {
85401025dddSPiotr Zegar     return true;
85501025dddSPiotr Zegar   } else {
85601025dddSPiotr Zegar     return false;
85701025dddSPiotr Zegar   }
85801025dddSPiotr Zegar }
85901025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
86001025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return a && b;{{$}}
86101025dddSPiotr Zegar 
86201025dddSPiotr Zegar class Comparable
86301025dddSPiotr Zegar {
86401025dddSPiotr Zegar public:
operator ==(Comparable const & rhs)86501025dddSPiotr Zegar   bool operator==(Comparable const &rhs) { return true; }
operator !=(Comparable const & rhs)86601025dddSPiotr Zegar   bool operator!=(Comparable const &rhs) { return false; }
86701025dddSPiotr Zegar };
86801025dddSPiotr Zegar 
comparable_objects()86901025dddSPiotr Zegar bool comparable_objects() {
87001025dddSPiotr Zegar   Comparable c;
87101025dddSPiotr Zegar   Comparable d;
87201025dddSPiotr Zegar   if (c == d) {
87301025dddSPiotr Zegar     return true;
87401025dddSPiotr Zegar   } else {
87501025dddSPiotr Zegar     return false;
87601025dddSPiotr Zegar   }
87701025dddSPiotr Zegar }
87801025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
87901025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return c == d;{{$}}
88001025dddSPiotr Zegar 
negated_comparable_objects()88101025dddSPiotr Zegar bool negated_comparable_objects() {
88201025dddSPiotr Zegar   Comparable c;
88301025dddSPiotr Zegar   Comparable d;
88401025dddSPiotr Zegar   if (c == d) {
88501025dddSPiotr Zegar     return false;
88601025dddSPiotr Zegar   } else {
88701025dddSPiotr Zegar     return true;
88801025dddSPiotr Zegar   }
88901025dddSPiotr Zegar }
89001025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
89101025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return c != d;{{$}}
89201025dddSPiotr Zegar 
89301025dddSPiotr Zegar struct X {
89401025dddSPiotr Zegar   explicit operator bool();
89501025dddSPiotr Zegar };
89601025dddSPiotr Zegar 
explicit_conversion_assignment(X x)89701025dddSPiotr Zegar void explicit_conversion_assignment(X x) {
89801025dddSPiotr Zegar   bool y;
89901025dddSPiotr Zegar   if (x) {
90001025dddSPiotr Zegar     y = true;
90101025dddSPiotr Zegar   } else {
90201025dddSPiotr Zegar     y = false;
90301025dddSPiotr Zegar   }
90401025dddSPiotr Zegar }
90501025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment
90601025dddSPiotr Zegar // CHECK-FIXES: {{^  bool y;$}}
90701025dddSPiotr Zegar // CHECK-FIXES: {{^}}  y = static_cast<bool>(x);{{$}}
90801025dddSPiotr Zegar 
ternary_integer_condition(int i)90901025dddSPiotr Zegar void ternary_integer_condition(int i) {
91001025dddSPiotr Zegar   bool b = i ? true : false;
91101025dddSPiotr Zegar }
91201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result
91301025dddSPiotr Zegar // CHECK-FIXES: bool b = i != 0;{{$}}
91401025dddSPiotr Zegar 
non_null_pointer_condition(int * p1)91501025dddSPiotr Zegar bool non_null_pointer_condition(int *p1) {
91601025dddSPiotr Zegar   if (p1) {
91701025dddSPiotr Zegar     return true;
91801025dddSPiotr Zegar   } else {
91901025dddSPiotr Zegar     return false;
92001025dddSPiotr Zegar   }
92101025dddSPiotr Zegar }
92201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
92301025dddSPiotr Zegar // CHECK-FIXES: return p1 != nullptr;{{$}}
92401025dddSPiotr Zegar 
null_pointer_condition(int * p2)92501025dddSPiotr Zegar bool null_pointer_condition(int *p2) {
92601025dddSPiotr Zegar   if (!p2) {
92701025dddSPiotr Zegar     return true;
92801025dddSPiotr Zegar   } else {
92901025dddSPiotr Zegar     return false;
93001025dddSPiotr Zegar   }
93101025dddSPiotr Zegar }
93201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
93301025dddSPiotr Zegar // CHECK-FIXES: return p2 == nullptr;{{$}}
93401025dddSPiotr Zegar 
negated_non_null_pointer_condition(int * p3)93501025dddSPiotr Zegar bool negated_non_null_pointer_condition(int *p3) {
93601025dddSPiotr Zegar   if (p3) {
93701025dddSPiotr Zegar     return false;
93801025dddSPiotr Zegar   } else {
93901025dddSPiotr Zegar     return true;
94001025dddSPiotr Zegar   }
94101025dddSPiotr Zegar }
94201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
94301025dddSPiotr Zegar // CHECK-FIXES: return p3 == nullptr;{{$}}
94401025dddSPiotr Zegar 
negated_null_pointer_condition(int * p4)94501025dddSPiotr Zegar bool negated_null_pointer_condition(int *p4) {
94601025dddSPiotr Zegar   if (!p4) {
94701025dddSPiotr Zegar     return false;
94801025dddSPiotr Zegar   } else {
94901025dddSPiotr Zegar     return true;
95001025dddSPiotr Zegar   }
95101025dddSPiotr Zegar }
95201025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
95301025dddSPiotr Zegar // CHECK-FIXES: return p4 != nullptr;{{$}}
95401025dddSPiotr Zegar 
comments_in_the_middle(bool b)95501025dddSPiotr Zegar bool comments_in_the_middle(bool b) {
95601025dddSPiotr Zegar   if (b) {
95701025dddSPiotr Zegar     return true;
95801025dddSPiotr Zegar   } else {
95901025dddSPiotr Zegar     // something wicked this way comes
96001025dddSPiotr Zegar     return false;
96101025dddSPiotr Zegar   }
96201025dddSPiotr Zegar }
96301025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return
96401025dddSPiotr Zegar // CHECK-FIXES: {{^}}  if (b) {
96501025dddSPiotr Zegar // CHECK-FIXES: // something wicked this way comes{{$}}
96601025dddSPiotr Zegar 
preprocessor_in_the_middle(bool b)96701025dddSPiotr Zegar bool preprocessor_in_the_middle(bool b) {
96801025dddSPiotr Zegar   if (b) {
96901025dddSPiotr Zegar     return true;
97001025dddSPiotr Zegar   } else {
97101025dddSPiotr Zegar #define SOMETHING_WICKED false
97201025dddSPiotr Zegar     return false;
97301025dddSPiotr Zegar   }
97401025dddSPiotr Zegar }
97501025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return
97601025dddSPiotr Zegar // CHECK-FIXES: {{^}}  if (b) {
97701025dddSPiotr Zegar // CHECK-FIXES: {{^}}#define SOMETHING_WICKED false
97801025dddSPiotr Zegar 
integer_not_zero(int i)97901025dddSPiotr Zegar bool integer_not_zero(int i) {
98001025dddSPiotr Zegar   if (i) {
98101025dddSPiotr Zegar     return false;
98201025dddSPiotr Zegar   } else {
98301025dddSPiotr Zegar     return true;
98401025dddSPiotr Zegar   }
98501025dddSPiotr Zegar }
98601025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
98701025dddSPiotr Zegar // CHECK-FIXES: {{^}}  return i == 0;{{$}}
98801025dddSPiotr Zegar 
98901025dddSPiotr Zegar class A {
99001025dddSPiotr Zegar public:
99101025dddSPiotr Zegar     int m;
99201025dddSPiotr Zegar };
99301025dddSPiotr Zegar 
member_pointer_nullptr(int A::* p)99401025dddSPiotr Zegar bool member_pointer_nullptr(int A::*p) {
99501025dddSPiotr Zegar   if (p) {
99601025dddSPiotr Zegar     return true;
99701025dddSPiotr Zegar   } else {
99801025dddSPiotr Zegar     return false;
99901025dddSPiotr Zegar   }
100001025dddSPiotr Zegar }
100101025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
100201025dddSPiotr Zegar // CHECK-FIXES: return p != nullptr;{{$}}
100301025dddSPiotr Zegar 
integer_member_implicit_cast(A * p)100401025dddSPiotr Zegar bool integer_member_implicit_cast(A *p) {
100501025dddSPiotr Zegar   if (p->m) {
100601025dddSPiotr Zegar     return true;
100701025dddSPiotr Zegar   } else {
100801025dddSPiotr Zegar     return false;
100901025dddSPiotr Zegar   }
101001025dddSPiotr Zegar }
101101025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
101201025dddSPiotr Zegar // CHECK-FIXES: return p->m != 0;{{$}}
101301025dddSPiotr Zegar 
operator !=(const A &,const A &)101401025dddSPiotr Zegar bool operator!=(const A&, const A&) { return false; }
expr_with_cleanups(A & S)101501025dddSPiotr Zegar bool expr_with_cleanups(A &S) {
101601025dddSPiotr Zegar   if (S != (A)S)
101701025dddSPiotr Zegar     return false;
101801025dddSPiotr Zegar 
101901025dddSPiotr Zegar   return true;
102001025dddSPiotr Zegar }
102101025dddSPiotr Zegar // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return
102201025dddSPiotr Zegar // CHECK-FIXES: S == (A)S;{{$}}
102301025dddSPiotr Zegar 
102401025dddSPiotr Zegar template <bool B>
ignoreInstantiations()102501025dddSPiotr Zegar void ignoreInstantiations() {
102601025dddSPiotr Zegar   if (B) {
102701025dddSPiotr Zegar     return;
102801025dddSPiotr Zegar   } else {
102901025dddSPiotr Zegar     return;
103001025dddSPiotr Zegar   }
103101025dddSPiotr Zegar }
103201025dddSPiotr Zegar 
instantiate()103301025dddSPiotr Zegar void instantiate() {
103401025dddSPiotr Zegar   // Just make sure the check isn't fooled by template instantiations.
103501025dddSPiotr Zegar   ignoreInstantiations<true>();
103601025dddSPiotr Zegar   ignoreInstantiations<false>();
103701025dddSPiotr Zegar }
1038