|  | // RUN: %check_clang_tidy %s readability-simplify-boolean-expr %t | 
|  |  | 
|  | bool a1 = false; | 
|  |  | 
|  | //=-=-=-=-=-=-= operator == | 
|  | bool aa = false == a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: redundant boolean literal supplied to boolean operator [readability-simplify-boolean-expr] | 
|  | // CHECK-FIXES: {{^bool aa = !a1;$}} | 
|  | bool ab = true == a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool ab = a1;$}} | 
|  | bool a2 = a1 == false; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a2 = !a1;$}} | 
|  | bool a3 = a1 == true; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a3 = a1;$}} | 
|  |  | 
|  | //=-=-=-=-=-=-= operator != | 
|  | bool n1 = a1 != false; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool n1 = a1;$}} | 
|  | bool n2 = a1 != true; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool n2 = !a1;$}} | 
|  | bool n3 = false != a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool n3 = a1;$}} | 
|  | bool n4 = true != a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool n4 = !a1;$}} | 
|  |  | 
|  | //=-=-=-=-=-=-= operator || | 
|  | bool a4 = a1 || false; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a4 = a1;$}} | 
|  | bool a5 = a1 || true; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a5 = true;$}} | 
|  | bool a6 = false || a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a6 = a1;$}} | 
|  | bool a7 = true || a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a7 = true;$}} | 
|  |  | 
|  | //=-=-=-=-=-=-= operator && | 
|  | bool a8 = a1 && false; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a8 = false;$}} | 
|  | bool a9 = a1 && true; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool a9 = a1;$}} | 
|  | bool ac = false && a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool ac = false;$}} | 
|  | bool ad = true && a1; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^bool ad = a1;$}} | 
|  |  | 
|  | void if_with_bool_literal_condition() { | 
|  | int i = 0; | 
|  | if (false) { | 
|  | i = 1; | 
|  | } else { | 
|  | i = 2; | 
|  | } | 
|  | i = 3; | 
|  | // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition | 
|  | // CHECK-FIXES:      {{^  int i = 0;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  {$}} | 
|  | // CHECK-FIXES-NEXT: {{^    i = 2;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  }$}} | 
|  | // CHECK-FIXES-NEXT: {{^  i = 3;$}} | 
|  |  | 
|  | i = 4; | 
|  | if (true) { | 
|  | i = 5; | 
|  | } else { | 
|  | i = 6; | 
|  | } | 
|  | i = 7; | 
|  | // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition | 
|  | // CHECK-FIXES:      {{^  i = 4;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  {$}} | 
|  | // CHECK-FIXES-NEXT: {{^    i = 5;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  }$}} | 
|  | // CHECK-FIXES-NEXT: {{^  i = 7;$}} | 
|  |  | 
|  | i = 8; | 
|  | if (false) { | 
|  | i = 9; | 
|  | } | 
|  | i = 11; | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition | 
|  | // CHECK-FIXES:      {{^  i = 8;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  $}} | 
|  | // CHECK-FIXES-NEXT: {{^  i = 11;$}} | 
|  | } | 
|  |  | 
|  | void if_with_negated_bool_condition() { | 
|  | int i = 10; | 
|  | if (!true) { | 
|  | i = 11; | 
|  | } else { | 
|  | i = 12; | 
|  | } | 
|  | i = 13; | 
|  | // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition | 
|  | // CHECK-FIXES:      {{^  int i = 10;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  {$}} | 
|  | // CHECK-FIXES-NEXT: {{^    i = 12;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  }$}} | 
|  | // CHECK-FIXES-NEXT: {{^  i = 13;$}} | 
|  |  | 
|  | i = 14; | 
|  | if (!false) { | 
|  | i = 15; | 
|  | } else { | 
|  | i = 16; | 
|  | } | 
|  | i = 17; | 
|  | // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition | 
|  | // CHECK-FIXES:      {{^  i = 14;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  {$}} | 
|  | // CHECK-FIXES-NEXT: {{^    i = 15;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  }$}} | 
|  | // CHECK-FIXES-NEXT: {{^  i = 17;$}} | 
|  |  | 
|  | i = 18; | 
|  | if (!true) { | 
|  | i = 19; | 
|  | } | 
|  | i = 20; | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition | 
|  | // CHECK-FIXES:      {{^  i = 18;$}} | 
|  | // CHECK-FIXES-NEXT: {{^  $}} | 
|  | // CHECK-FIXES-NEXT: {{^  i = 20;$}} | 
|  | } | 
|  |  | 
|  | void operator_equals() { | 
|  | int i = 0; | 
|  | bool b1 = (i > 2); | 
|  | if (b1 == true) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(b1\) {$}} | 
|  | i = 5; | 
|  | } else { | 
|  | i = 6; | 
|  | } | 
|  | bool b2 = (i > 4); | 
|  | if (b2 == false) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(!b2\) {$}} | 
|  | i = 7; | 
|  | } else { | 
|  | i = 9; | 
|  | } | 
|  | bool b3 = (i > 6); | 
|  | if (true == b3) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(b3\) {$}} | 
|  | i = 10; | 
|  | } else { | 
|  | i = 11; | 
|  | } | 
|  | bool b4 = (i > 8); | 
|  | if (false == b4) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(!b4\) {$}} | 
|  | i = 12; | 
|  | } else { | 
|  | i = 13; | 
|  | } | 
|  | } | 
|  |  | 
|  | void operator_or() { | 
|  | int i = 0; | 
|  | bool b5 = (i > 10); | 
|  | if (b5 || false) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(b5\) {$}} | 
|  | i = 14; | 
|  | } else { | 
|  | i = 15; | 
|  | } | 
|  | bool b6 = (i > 10); | 
|  | if (b6 || true) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(true\) {$}} | 
|  | i = 16; | 
|  | } else { | 
|  | i = 17; | 
|  | } | 
|  | bool b7 = (i > 10); | 
|  | if (false || b7) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(b7\) {$}} | 
|  | i = 18; | 
|  | } else { | 
|  | i = 19; | 
|  | } | 
|  | bool b8 = (i > 10); | 
|  | if (true || b8) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(true\) {$}} | 
|  | i = 20; | 
|  | } else { | 
|  | i = 21; | 
|  | } | 
|  | } | 
|  |  | 
|  | void operator_and() { | 
|  | int i = 0; | 
|  | bool b9 = (i > 20); | 
|  | if (b9 && false) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(false\) {$}} | 
|  | i = 22; | 
|  | } else { | 
|  | i = 23; | 
|  | } | 
|  | bool ba = (i > 20); | 
|  | if (ba && true) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(ba\) {$}} | 
|  | i = 24; | 
|  | } else { | 
|  | i = 25; | 
|  | } | 
|  | bool bb = (i > 20); | 
|  | if (false && bb) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(false\) {$}} | 
|  | i = 26; | 
|  | } else { | 
|  | i = 27; | 
|  | } | 
|  | bool bc = (i > 20); | 
|  | if (true && bc) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(bc\) {$}} | 
|  | i = 28; | 
|  | } else { | 
|  | i = 29; | 
|  | } | 
|  | } | 
|  |  | 
|  | void ternary_operator() { | 
|  | int i = 0; | 
|  | bool bd = (i > 20) ? true : false; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result | 
|  | // CHECK-FIXES: {{^  bool bd = i > 20;$}} | 
|  |  | 
|  | bool be = (i > 20) ? false : true; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result | 
|  | // CHECK-FIXES: {{^  bool be = i <= 20;$}} | 
|  |  | 
|  | bool bf = ((i > 20)) ? false : true; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: {{.*}} in ternary expression result | 
|  | // CHECK-FIXES: {{^  bool bf = i <= 20;$}} | 
|  | } | 
|  |  | 
|  | void operator_not_equal() { | 
|  | int i = 0; | 
|  | bool bf = (i > 20); | 
|  | if (false != bf) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(bf\) {$}} | 
|  | i = 30; | 
|  | } else { | 
|  | i = 31; | 
|  | } | 
|  | bool bg = (i > 20); | 
|  | if (true != bg) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(!bg\) {$}} | 
|  | i = 32; | 
|  | } else { | 
|  | i = 33; | 
|  | } | 
|  | bool bh = (i > 20); | 
|  | if (bh != false) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(bh\) {$}} | 
|  | i = 34; | 
|  | } else { | 
|  | i = 35; | 
|  | } | 
|  | bool bi = (i > 20); | 
|  | if (bi != true) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(!bi\) {$}} | 
|  | i = 36; | 
|  | } else { | 
|  | i = 37; | 
|  | } | 
|  | } | 
|  |  | 
|  | void nested_booleans() { | 
|  | if (false || (true || false)) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(false \|\| \(true\)\) {$}} | 
|  | } | 
|  | if (true && (true || false)) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(true && \(true\)\) {$}} | 
|  | } | 
|  | if (false || (true && false)) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(false \|\| \(false\)\) {$}} | 
|  | } | 
|  | if (true && (true && false)) { | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator | 
|  | // CHECK-FIXES: {{^  if \(true && \(false\)\) {$}} | 
|  | } | 
|  | } | 
|  |  | 
|  | static constexpr bool truthy() { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | #define HAS_XYZ_FEATURE true | 
|  | #define M1(what) M2(true, what) | 
|  | #define M2(condition, what) if (condition) what | 
|  |  | 
|  | void macros_and_constexprs(int i = 0) { | 
|  | bool b = (i == 1); | 
|  | if (b && truthy()) { | 
|  | // leave this alone; if you want it simplified, then you should | 
|  | // inline the constexpr function first. | 
|  | i = 1; | 
|  | } | 
|  | i = 2; | 
|  | if (b && HAS_XYZ_FEATURE) { | 
|  | // leave this alone; if you want it simplified, then you should | 
|  | // inline the macro first. | 
|  | i = 3; | 
|  | } | 
|  | if (HAS_XYZ_FEATURE) { | 
|  | i = 5; | 
|  | } | 
|  | i = 4; | 
|  | M1(i = 7); | 
|  | } | 
|  |  | 
|  | #undef HAS_XYZ_FEATURE | 
|  |  | 
|  | bool conditional_return_statements(int i) { | 
|  | if (i == 0) return true; else return false; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}  return i == 0;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}$}} | 
|  |  | 
|  | bool conditional_return_statements_then_expr(int i, int j) { | 
|  | if (i == j) return (i == 0); else return false; | 
|  | } | 
|  |  | 
|  | bool conditional_return_statements_else_expr(int i, int j) { | 
|  | if (i == j) return true; else return (i == 0); | 
|  | } | 
|  |  | 
|  | bool negated_conditional_return_statements(int i) { | 
|  | if (i == 0) return false; else return true; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}  return i != 0;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}$}} | 
|  |  | 
|  | bool negative_condition_conditional_return_statement(int i) { | 
|  | if (!(i == 0)) return false; else return true; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}  return i == 0;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}$}} | 
|  |  | 
|  | bool conditional_compound_return_statements(int i) { | 
|  | if (i == 1) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}bool conditional_compound_return_statements(int i) {{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}}  return i == 1;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}$}} | 
|  |  | 
|  | bool negated_conditional_compound_return_statements(int i) { | 
|  | if (i == 1) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}bool negated_conditional_compound_return_statements(int i) {{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}}  return i != 1;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}$}} | 
|  |  | 
|  | bool conditional_return_statements_side_effects_then(int i) { | 
|  | if (i == 2) { | 
|  | macros_and_constexprs(); | 
|  | return true; | 
|  | } else | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool negated_conditional_return_statements_side_effects_then(int i) { | 
|  | if (i == 2) { | 
|  | macros_and_constexprs(); | 
|  | return false; | 
|  | } else | 
|  | return true; | 
|  | } | 
|  |  | 
|  | bool conditional_return_statements_side_effects_else(int i) { | 
|  | if (i == 2) | 
|  | return true; | 
|  | else { | 
|  | macros_and_constexprs(); | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | bool negated_conditional_return_statements_side_effects_else(int i) { | 
|  | if (i == 2) | 
|  | return false; | 
|  | else { | 
|  | macros_and_constexprs(); | 
|  | return true; | 
|  | } | 
|  | } | 
|  |  | 
|  | void lambda_conditional_return_statements() { | 
|  | auto lambda = [](int n) -> bool { if (n > 0) return true; else return false; }; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:55: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES: {{^}}  auto lambda = [](int n) -> bool { return n > 0; };{{$}} | 
|  |  | 
|  | auto lambda2 = [](int n) -> bool { | 
|  | if (n > 0) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | }; | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:16: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}  auto lambda2 = [](int n) -> bool {{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}}    return n > 0;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}}  };{{$}} | 
|  |  | 
|  | auto lambda3 = [](int n) -> bool { if (n > 0) {macros_and_constexprs(); return true; } else return false; }; | 
|  |  | 
|  | auto lambda4 = [](int n) -> bool { | 
|  | if (n > 0) | 
|  | return true; | 
|  | else { | 
|  | macros_and_constexprs(); | 
|  | return false; | 
|  | } | 
|  | }; | 
|  |  | 
|  | auto lambda5 = [](int n) -> bool { if (n > 0) return false; else return true; }; | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES: {{^}}  auto lambda5 = [](int n) -> bool { return n <= 0; };{{$}} | 
|  |  | 
|  | auto lambda6 = [](int n) -> bool { | 
|  | if (n > 0) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | }; | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:16: warning: {{.*}} in conditional return statement | 
|  | // CHECK-FIXES:      {{^}}  auto lambda6 = [](int n) -> bool {{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}}    return n <= 0;{{$}} | 
|  | // CHECK-FIXES-NEXT: {{^}}  };{{$}} | 
|  | } | 
|  |  | 
|  | void simple_conditional_assignment_statements(int i) { | 
|  | bool b; | 
|  | if (i > 10) | 
|  | b = true; | 
|  | else | 
|  | b = false; | 
|  | bool bb = false; | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment | 
|  | // CHECK-FIXES: bool b; | 
|  | // CHECK-FIXES: {{^  }}b = i > 10;{{$}} | 
|  | // CHECK-FIXES: bool bb = false; | 
|  |  | 
|  | bool c; | 
|  | if (i > 20) | 
|  | c = false; | 
|  | else | 
|  | c = true; | 
|  | bool c2 = false; | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment | 
|  | // CHECK-FIXES: bool c; | 
|  | // CHECK-FIXES: {{^  }}c = i <= 20;{{$}} | 
|  | // CHECK-FIXES: bool c2 = false; | 
|  |  | 
|  | // Unchanged: different variables. | 
|  | bool b2; | 
|  | if (i > 12) | 
|  | b = true; | 
|  | else | 
|  | b2 = false; | 
|  |  | 
|  | // Unchanged: no else statement. | 
|  | bool b3; | 
|  | if (i > 15) | 
|  | b3 = true; | 
|  |  | 
|  | // Unchanged: not boolean assignment. | 
|  | int j; | 
|  | if (i > 17) | 
|  | j = 10; | 
|  | else | 
|  | j = 20; | 
|  |  | 
|  | // Unchanged: different variables assigned. | 
|  | int k = 0; | 
|  | bool b4 = false; | 
|  | if (i > 10) | 
|  | b4 = true; | 
|  | else | 
|  | k = 10; | 
|  | } | 
|  |  | 
|  | void complex_conditional_assignment_statements(int i) { | 
|  | bool d; | 
|  | if (i > 30) { | 
|  | d = true; | 
|  | } else { | 
|  | d = false; | 
|  | } | 
|  | d = false; | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment | 
|  | // CHECK-FIXES: bool d; | 
|  | // CHECK-FIXES: {{^  }}d = i > 30;{{$}} | 
|  | // CHECK-FIXES: d = false; | 
|  |  | 
|  | bool e; | 
|  | if (i > 40) { | 
|  | e = false; | 
|  | } else { | 
|  | e = true; | 
|  | } | 
|  | e = false; | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment | 
|  | // CHECK-FIXES: bool e; | 
|  | // CHECK-FIXES: {{^  }}e = i <= 40;{{$}} | 
|  | // CHECK-FIXES: e = false; | 
|  |  | 
|  | // Unchanged: no else statement. | 
|  | bool b3; | 
|  | if (i > 15) { | 
|  | b3 = true; | 
|  | } | 
|  |  | 
|  | // Unchanged: not a boolean assignment. | 
|  | int j; | 
|  | if (i > 17) { | 
|  | j = 10; | 
|  | } else { | 
|  | j = 20; | 
|  | } | 
|  |  | 
|  | // Unchanged: multiple statements. | 
|  | bool f; | 
|  | if (j > 10) { | 
|  | j = 10; | 
|  | f = true; | 
|  | } else { | 
|  | j = 20; | 
|  | f = false; | 
|  | } | 
|  |  | 
|  | // Unchanged: multiple statements. | 
|  | bool g; | 
|  | if (j > 10) | 
|  | f = true; | 
|  | else { | 
|  | j = 20; | 
|  | f = false; | 
|  | } | 
|  |  | 
|  | // Unchanged: multiple statements. | 
|  | bool h; | 
|  | if (j > 10) { | 
|  | j = 10; | 
|  | f = true; | 
|  | } else | 
|  | f = false; | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | bool chained_conditional_compound_return(int i) { | 
|  | if (i < 0) { | 
|  | return true; | 
|  | } else if (i < 10) { | 
|  | return false; | 
|  | } else if (i > 20) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | bool chained_conditional_return(int i) { | 
|  | if (i < 0) | 
|  | return true; | 
|  | else if (i < 10) | 
|  | return false; | 
|  | else if (i > 20) | 
|  | return true; | 
|  | else | 
|  | return false; | 
|  | } | 
|  |  | 
|  | // Unchanged: chained assignments, but ChainedConditionalAssignment not set. | 
|  | void chained_conditional_compound_assignment(int i) { | 
|  | bool b; | 
|  | if (i < 0) { | 
|  | b = true; | 
|  | } else if (i < 10) { | 
|  | b = false; | 
|  | } else if (i > 20) { | 
|  | b = true; | 
|  | } else { | 
|  | b = false; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | void chained_conditional_assignment(int i) { | 
|  | bool b; | 
|  | if (i < 0) | 
|  | b = true; | 
|  | else if (i < 10) | 
|  | b = false; | 
|  | else if (i > 20) | 
|  | b = true; | 
|  | else | 
|  | b = false; | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | bool chained_simple_if_return_negated(int i) { | 
|  | if (i < 5) | 
|  | return false; | 
|  | if (i > 10) | 
|  | return false; | 
|  | return true; | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | bool complex_chained_if_return_return(int i) { | 
|  | if (i < 5) { | 
|  | return true; | 
|  | } | 
|  | if (i > 10) { | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | bool complex_chained_if_return_return_negated(int i) { | 
|  | if (i < 5) { | 
|  | return false; | 
|  | } | 
|  | if (i > 10) { | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | // Unchanged: chained return statements, but ChainedConditionalReturn not set. | 
|  | bool chained_simple_if_return(int i) { | 
|  | if (i < 5) | 
|  | return true; | 
|  | if (i > 10) | 
|  | return true; | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool simple_if_return_return(int i) { | 
|  | if (i > 10) | 
|  | return true; | 
|  | return false; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}bool simple_if_return_return(int i) {{{$}} | 
|  | // CHECK-FIXES: {{^  return i > 10;$}} | 
|  | // CHECK-FIXES: {{^}$}} | 
|  |  | 
|  | bool simple_if_return_return_negated(int i) { | 
|  | if (i > 10) | 
|  | return false; | 
|  | return true; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}bool simple_if_return_return_negated(int i) {{{$}} | 
|  | // CHECK-FIXES: {{^  return i <= 10;$}} | 
|  | // CHECK-FIXES: {{^}$}} | 
|  |  | 
|  | bool complex_if_return_return(int i) { | 
|  | if (i > 10) { | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}bool complex_if_return_return(int i) {{{$}} | 
|  | // CHECK-FIXES: {{^  return i > 10;$}} | 
|  | // CHECK-FIXES: {{^}$}} | 
|  |  | 
|  | bool complex_if_return_return_negated(int i) { | 
|  | if (i > 10) { | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}bool complex_if_return_return_negated(int i) {{{$}} | 
|  | // CHECK-FIXES: {{^  return i <= 10;$}} | 
|  | // CHECK-FIXES: {{^}$}} | 
|  |  | 
|  | bool if_implicit_bool_expr(int i) { | 
|  | if (i & 1) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return (i & 1) != 0;{{$}} | 
|  |  | 
|  | bool negated_if_implicit_bool_expr(int i) { | 
|  | if (i - 1) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return (i - 1) == 0;{{$}} | 
|  |  | 
|  | bool implicit_int(int i) { | 
|  | if (i) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return i != 0;{{$}} | 
|  |  | 
|  | bool explicit_bool(bool b) { | 
|  | if (b) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return b;{{$}} | 
|  |  | 
|  | class Implicit { | 
|  | public: | 
|  | operator bool() { | 
|  | return true; | 
|  | } | 
|  | }; | 
|  |  | 
|  | bool object_bool_implicit_conversion(Implicit O) { | 
|  | if (O) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return O;{{$}} | 
|  |  | 
|  | bool negated_explicit_bool(bool b) { | 
|  | if (!b) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return !b;{{$}} | 
|  |  | 
|  | bool bitwise_complement_conversion(int i) { | 
|  | if (~i) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return ~i != 0;{{$}} | 
|  |  | 
|  | bool logical_or(bool a, bool b) { | 
|  | if (a || b) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return a || b;{{$}} | 
|  |  | 
|  | bool logical_and(bool a, bool b) { | 
|  | if (a && b) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return a && b;{{$}} | 
|  |  | 
|  | class Comparable | 
|  | { | 
|  | public: | 
|  | bool operator==(Comparable const &rhs) { return true; } | 
|  | bool operator!=(Comparable const &rhs) { return false; } | 
|  | }; | 
|  |  | 
|  | bool comparable_objects() { | 
|  | Comparable c; | 
|  | Comparable d; | 
|  | if (c == d) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return c == d;{{$}} | 
|  |  | 
|  | bool negated_comparable_objects() { | 
|  | Comparable c; | 
|  | Comparable d; | 
|  | if (c == d) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return c != d;{{$}} | 
|  |  | 
|  | struct X { | 
|  | explicit operator bool(); | 
|  | }; | 
|  |  | 
|  | void explicit_conversion_assignment(X x) { | 
|  | bool y; | 
|  | if (x) { | 
|  | y = true; | 
|  | } else { | 
|  | y = false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment | 
|  | // CHECK-FIXES: {{^  bool y;$}} | 
|  | // CHECK-FIXES: {{^}}  y = static_cast<bool>(x);{{$}} | 
|  |  | 
|  | void ternary_integer_condition(int i) { | 
|  | bool b = i ? true : false; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result | 
|  | // CHECK-FIXES: bool b = i != 0;{{$}} | 
|  |  | 
|  | bool non_null_pointer_condition(int *p1) { | 
|  | if (p1) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: return p1 != nullptr;{{$}} | 
|  |  | 
|  | bool null_pointer_condition(int *p2) { | 
|  | if (!p2) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: return p2 == nullptr;{{$}} | 
|  |  | 
|  | bool negated_non_null_pointer_condition(int *p3) { | 
|  | if (p3) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: return p3 == nullptr;{{$}} | 
|  |  | 
|  | bool negated_null_pointer_condition(int *p4) { | 
|  | if (!p4) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: return p4 != nullptr;{{$}} | 
|  |  | 
|  | bool comments_in_the_middle(bool b) { | 
|  | if (b) { | 
|  | return true; | 
|  | } else { | 
|  | // something wicked this way comes | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  if (b) { | 
|  | // CHECK-FIXES: // something wicked this way comes{{$}} | 
|  |  | 
|  | bool preprocessor_in_the_middle(bool b) { | 
|  | if (b) { | 
|  | return true; | 
|  | } else { | 
|  | #define SOMETHING_WICKED false | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  if (b) { | 
|  | // CHECK-FIXES: {{^}}#define SOMETHING_WICKED false | 
|  |  | 
|  | bool integer_not_zero(int i) { | 
|  | if (i) { | 
|  | return false; | 
|  | } else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: {{^}}  return i == 0;{{$}} | 
|  |  | 
|  | class A { | 
|  | public: | 
|  | int m; | 
|  | }; | 
|  |  | 
|  | bool member_pointer_nullptr(int A::*p) { | 
|  | if (p) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: return p != nullptr;{{$}} | 
|  |  | 
|  | bool integer_member_implicit_cast(A *p) { | 
|  | if (p->m) { | 
|  | return true; | 
|  | } else { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: return p->m != 0;{{$}} | 
|  |  | 
|  | bool operator!=(const A&, const A&) { return false; } | 
|  | bool expr_with_cleanups(A &S) { | 
|  | if (S != (A)S) | 
|  | return false; | 
|  |  | 
|  | return true; | 
|  | } | 
|  | // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return | 
|  | // CHECK-FIXES: S == (A)S;{{$}} | 
|  |  | 
|  | template <bool B> | 
|  | void ignoreInstantiations() { | 
|  | if (B) { | 
|  | return; | 
|  | } else { | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | void instantiate() { | 
|  | // Just make sure the check isn't fooled by template instantiations. | 
|  | ignoreInstantiations<true>(); | 
|  | ignoreInstantiations<false>(); | 
|  | } |