// 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 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(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;{{$}}