1038 lines · cpp
1// RUN: %check_clang_tidy %s readability-simplify-boolean-expr %t2 3bool a1 = false;4 5//=-=-=-=-=-=-= operator ==6bool aa = false == a1;7// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: redundant boolean literal supplied to boolean operator [readability-simplify-boolean-expr]8// CHECK-FIXES: {{^bool aa = !a1;$}}9bool ab = true == a1;10// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator11// CHECK-FIXES: {{^bool ab = a1;$}}12bool a2 = a1 == false;13// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator14// CHECK-FIXES: {{^bool a2 = !a1;$}}15bool a3 = a1 == true;16// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator17// CHECK-FIXES: {{^bool a3 = a1;$}}18 19//=-=-=-=-=-=-= operator !=20bool n1 = a1 != false;21// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator22// CHECK-FIXES: {{^bool n1 = a1;$}}23bool n2 = a1 != true;24// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator25// CHECK-FIXES: {{^bool n2 = !a1;$}}26bool n3 = false != a1;27// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator28// CHECK-FIXES: {{^bool n3 = a1;$}}29bool n4 = true != a1;30// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator31// CHECK-FIXES: {{^bool n4 = !a1;$}}32 33//=-=-=-=-=-=-= operator ||34bool a4 = a1 || false;35// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator36// CHECK-FIXES: {{^bool a4 = a1;$}}37bool a5 = a1 || true;38// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator39// CHECK-FIXES: {{^bool a5 = true;$}}40bool a6 = false || a1;41// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator42// CHECK-FIXES: {{^bool a6 = a1;$}}43bool a7 = true || a1;44// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator45// CHECK-FIXES: {{^bool a7 = true;$}}46 47//=-=-=-=-=-=-= operator &&48bool a8 = a1 && false;49// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator50// CHECK-FIXES: {{^bool a8 = false;$}}51bool a9 = a1 && true;52// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator53// CHECK-FIXES: {{^bool a9 = a1;$}}54bool ac = false && a1;55// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator56// CHECK-FIXES: {{^bool ac = false;$}}57bool ad = true && a1;58// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} to boolean operator59// CHECK-FIXES: {{^bool ad = a1;$}}60 61void if_with_bool_literal_condition() {62 int i = 0;63 if (false) {64 i = 1;65 } else {66 i = 2;67 }68 i = 3;69 // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition70 // CHECK-FIXES: {{^ int i = 0;$}}71 // CHECK-FIXES-NEXT: {{^ {$}}72 // CHECK-FIXES-NEXT: {{^ i = 2;$}}73 // CHECK-FIXES-NEXT: {{^ }$}}74 // CHECK-FIXES-NEXT: {{^ i = 3;$}}75 76 i = 4;77 if (true) {78 i = 5;79 } else {80 i = 6;81 }82 i = 7;83 // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition84 // CHECK-FIXES: {{^ i = 4;$}}85 // CHECK-FIXES-NEXT: {{^ {$}}86 // CHECK-FIXES-NEXT: {{^ i = 5;$}}87 // CHECK-FIXES-NEXT: {{^ }$}}88 // CHECK-FIXES-NEXT: {{^ i = 7;$}}89 90 i = 8;91 if (false) {92 i = 9;93 }94 i = 11;95 // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition96 // CHECK-FIXES: {{^ i = 8;$}}97 // CHECK-FIXES-NEXT: {{^ $}}98 // CHECK-FIXES-NEXT: {{^ i = 11;$}}99}100 101void if_with_negated_bool_condition() {102 int i = 10;103 if (!true) {104 i = 11;105 } else {106 i = 12;107 }108 i = 13;109 // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition110 // CHECK-FIXES: {{^ int i = 10;$}}111 // CHECK-FIXES-NEXT: {{^ {$}}112 // CHECK-FIXES-NEXT: {{^ i = 12;$}}113 // CHECK-FIXES-NEXT: {{^ }$}}114 // CHECK-FIXES-NEXT: {{^ i = 13;$}}115 116 i = 14;117 if (!false) {118 i = 15;119 } else {120 i = 16;121 }122 i = 17;123 // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition124 // CHECK-FIXES: {{^ i = 14;$}}125 // CHECK-FIXES-NEXT: {{^ {$}}126 // CHECK-FIXES-NEXT: {{^ i = 15;$}}127 // CHECK-FIXES-NEXT: {{^ }$}}128 // CHECK-FIXES-NEXT: {{^ i = 17;$}}129 130 i = 18;131 if (!true) {132 i = 19;133 }134 i = 20;135 // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition136 // CHECK-FIXES: {{^ i = 18;$}}137 // CHECK-FIXES-NEXT: {{^ $}}138 // CHECK-FIXES-NEXT: {{^ i = 20;$}}139}140 141void operator_equals() {142 int i = 0;143 bool b1 = (i > 2);144 if (b1 == true) {145 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator146 // CHECK-FIXES: {{^ if \(b1\) {$}}147 i = 5;148 } else {149 i = 6;150 }151 bool b2 = (i > 4);152 if (b2 == false) {153 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator154 // CHECK-FIXES: {{^ if \(!b2\) {$}}155 i = 7;156 } else {157 i = 9;158 }159 bool b3 = (i > 6);160 if (true == b3) {161 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator162 // CHECK-FIXES: {{^ if \(b3\) {$}}163 i = 10;164 } else {165 i = 11;166 }167 bool b4 = (i > 8);168 if (false == b4) {169 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator170 // CHECK-FIXES: {{^ if \(!b4\) {$}}171 i = 12;172 } else {173 i = 13;174 }175}176 177void operator_or() {178 int i = 0;179 bool b5 = (i > 10);180 if (b5 || false) {181 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator182 // CHECK-FIXES: {{^ if \(b5\) {$}}183 i = 14;184 } else {185 i = 15;186 }187 bool b6 = (i > 10);188 if (b6 || true) {189 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator190 // CHECK-FIXES: {{^ if \(true\) {$}}191 i = 16;192 } else {193 i = 17;194 }195 bool b7 = (i > 10);196 if (false || b7) {197 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator198 // CHECK-FIXES: {{^ if \(b7\) {$}}199 i = 18;200 } else {201 i = 19;202 }203 bool b8 = (i > 10);204 if (true || b8) {205 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator206 // CHECK-FIXES: {{^ if \(true\) {$}}207 i = 20;208 } else {209 i = 21;210 }211}212 213void operator_and() {214 int i = 0;215 bool b9 = (i > 20);216 if (b9 && false) {217 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator218 // CHECK-FIXES: {{^ if \(false\) {$}}219 i = 22;220 } else {221 i = 23;222 }223 bool ba = (i > 20);224 if (ba && true) {225 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator226 // CHECK-FIXES: {{^ if \(ba\) {$}}227 i = 24;228 } else {229 i = 25;230 }231 bool bb = (i > 20);232 if (false && bb) {233 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator234 // CHECK-FIXES: {{^ if \(false\) {$}}235 i = 26;236 } else {237 i = 27;238 }239 bool bc = (i > 20);240 if (true && bc) {241 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator242 // CHECK-FIXES: {{^ if \(bc\) {$}}243 i = 28;244 } else {245 i = 29;246 }247}248 249void ternary_operator() {250 int i = 0;251 bool bd = (i > 20) ? true : false;252 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result253 // CHECK-FIXES: {{^ bool bd = i > 20;$}}254 255 bool be = (i > 20) ? false : true;256 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result257 // CHECK-FIXES: {{^ bool be = i <= 20;$}}258 259 bool bf = ((i > 20)) ? false : true;260 // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: {{.*}} in ternary expression result261 // CHECK-FIXES: {{^ bool bf = i <= 20;$}}262}263 264void operator_not_equal() {265 int i = 0;266 bool bf = (i > 20);267 if (false != bf) {268 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator269 // CHECK-FIXES: {{^ if \(bf\) {$}}270 i = 30;271 } else {272 i = 31;273 }274 bool bg = (i > 20);275 if (true != bg) {276 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator277 // CHECK-FIXES: {{^ if \(!bg\) {$}}278 i = 32;279 } else {280 i = 33;281 }282 bool bh = (i > 20);283 if (bh != false) {284 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator285 // CHECK-FIXES: {{^ if \(bh\) {$}}286 i = 34;287 } else {288 i = 35;289 }290 bool bi = (i > 20);291 if (bi != true) {292 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator293 // CHECK-FIXES: {{^ if \(!bi\) {$}}294 i = 36;295 } else {296 i = 37;297 }298}299 300void nested_booleans() {301 if (false || (true || false)) {302 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator303 // CHECK-FIXES: {{^ if \(false \|\| \(true\)\) {$}}304 }305 if (true && (true || false)) {306 // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator307 // CHECK-FIXES: {{^ if \(true && \(true\)\) {$}}308 }309 if (false || (true && false)) {310 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator311 // CHECK-FIXES: {{^ if \(false \|\| \(false\)\) {$}}312 }313 if (true && (true && false)) {314 // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator315 // CHECK-FIXES: {{^ if \(true && \(false\)\) {$}}316 }317}318 319static constexpr bool truthy() {320 return true;321}322 323#define HAS_XYZ_FEATURE true324#define M1(what) M2(true, what)325#define M2(condition, what) if (condition) what326 327void macros_and_constexprs(int i = 0) {328 bool b = (i == 1);329 if (b && truthy()) {330 // leave this alone; if you want it simplified, then you should331 // inline the constexpr function first.332 i = 1;333 }334 i = 2;335 if (b && HAS_XYZ_FEATURE) {336 // leave this alone; if you want it simplified, then you should337 // inline the macro first.338 i = 3;339 }340 if (HAS_XYZ_FEATURE) {341 i = 5;342 }343 i = 4;344 M1(i = 7);345}346 347#undef HAS_XYZ_FEATURE348 349bool conditional_return_statements(int i) {350 if (i == 0) return true; else return false;351}352// CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement353// CHECK-FIXES: {{^}} return i == 0;{{$}}354// CHECK-FIXES-NEXT: {{^}$}}355 356bool conditional_return_statements_no_fix_1(int i) {357 if (i == 0) return true;358 // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}} in conditional return statement359 // CHECK-MESSAGES: :[[@LINE-2]]:7: note: conditions that can be simplified360 // comment361 return false;362 // CHECK-MESSAGES: :[[@LINE-1]]:3: note: return statement that can be simplified363}364 365bool conditional_return_statements_no_fix_2(int i) {366 if (i == 0) return true;367 // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}} in conditional return statement368 // CHECK-MESSAGES: :[[@LINE-2]]:7: note: conditions that can be simplified369 // comment370 else return false;371}372 373bool conditional_return_statements_then_expr(int i, int j) {374 if (i == j) return (i == 0); else return false;375}376 377bool conditional_return_statements_else_expr(int i, int j) {378 if (i == j) return true; else return (i == 0);379}380 381bool negated_conditional_return_statements(int i) {382 if (i == 0) return false; else return true;383}384// CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement385// CHECK-FIXES: {{^}} return i != 0;{{$}}386// CHECK-FIXES-NEXT: {{^}$}}387 388bool negative_condition_conditional_return_statement(int i) {389 if (!(i == 0)) return false; else return true;390}391// CHECK-MESSAGES: :[[@LINE-2]]:25: warning: {{.*}} in conditional return statement392// CHECK-FIXES: {{^}} return i == 0;{{$}}393// CHECK-FIXES-NEXT: {{^}$}}394 395bool conditional_compound_return_statements(int i) {396 if (i == 1) {397 return true;398 } else {399 return false;400 }401}402// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement403// CHECK-FIXES: {{^}}bool conditional_compound_return_statements(int i) {{{$}}404// CHECK-FIXES-NEXT: {{^}} return i == 1;{{$}}405// CHECK-FIXES-NEXT: {{^}$}}406 407bool negated_conditional_compound_return_statements(int i) {408 if (i == 1) {409 return false;410 } else {411 return true;412 }413}414// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement415// CHECK-FIXES: {{^}}bool negated_conditional_compound_return_statements(int i) {{{$}}416// CHECK-FIXES-NEXT: {{^}} return i != 1;{{$}}417// CHECK-FIXES-NEXT: {{^}$}}418 419bool conditional_return_statements_side_effects_then(int i) {420 if (i == 2) {421 macros_and_constexprs();422 return true;423 } else424 return false;425}426 427bool negated_conditional_return_statements_side_effects_then(int i) {428 if (i == 2) {429 macros_and_constexprs();430 return false;431 } else432 return true;433}434 435bool conditional_return_statements_side_effects_else(int i) {436 if (i == 2)437 return true;438 else {439 macros_and_constexprs();440 return false;441 }442}443 444bool negated_conditional_return_statements_side_effects_else(int i) {445 if (i == 2)446 return false;447 else {448 macros_and_constexprs();449 return true;450 }451}452 453void lambda_conditional_return_statements() {454 auto lambda = [](int n) -> bool { if (n > 0) return true; else return false; };455 // CHECK-MESSAGES: :[[@LINE-1]]:55: warning: {{.*}} in conditional return statement456 // CHECK-FIXES: {{^}} auto lambda = [](int n) -> bool { return n > 0; };{{$}}457 458 auto lambda2 = [](int n) -> bool {459 if (n > 0) {460 return true;461 } else {462 return false;463 }464 };465 // CHECK-MESSAGES: :[[@LINE-5]]:16: warning: {{.*}} in conditional return statement466 // CHECK-FIXES: {{^}} auto lambda2 = [](int n) -> bool {{{$}}467 // CHECK-FIXES-NEXT: {{^}} return n > 0;{{$}}468 // CHECK-FIXES-NEXT: {{^}} };{{$}}469 470 auto lambda3 = [](int n) -> bool { if (n > 0) {macros_and_constexprs(); return true; } else return false; };471 472 auto lambda4 = [](int n) -> bool {473 if (n > 0)474 return true;475 else {476 macros_and_constexprs();477 return false;478 }479 };480 481 auto lambda5 = [](int n) -> bool { if (n > 0) return false; else return true; };482 // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: {{.*}} in conditional return statement483 // CHECK-FIXES: {{^}} auto lambda5 = [](int n) -> bool { return n <= 0; };{{$}}484 485 auto lambda6 = [](int n) -> bool {486 if (n > 0) {487 return false;488 } else {489 return true;490 }491 };492 // CHECK-MESSAGES: :[[@LINE-5]]:16: warning: {{.*}} in conditional return statement493 // CHECK-FIXES: {{^}} auto lambda6 = [](int n) -> bool {{{$}}494 // CHECK-FIXES-NEXT: {{^}} return n <= 0;{{$}}495 // CHECK-FIXES-NEXT: {{^}} };{{$}}496}497 498bool condition_variable_return_stmt(int i) {499 // Unchanged: condition variable.500 if (bool Res = i == 0)501 return true;502 else503 return false;504}505 506void simple_conditional_assignment_statements(int i) {507 bool b;508 if (i > 10)509 b = true;510 else511 b = false;512 bool bb = false;513 // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment514 // CHECK-FIXES: bool b;515 // CHECK-FIXES: {{^ }}b = i > 10;{{$}}516 // CHECK-FIXES: bool bb = false;517 518 bool c;519 if (i > 20)520 c = false;521 else522 c = true;523 bool c2 = false;524 // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment525 // CHECK-FIXES: bool c;526 // CHECK-FIXES: {{^ }}c = i <= 20;{{$}}527 // CHECK-FIXES: bool c2 = false;528 529 // Unchanged: different variables.530 bool b2;531 if (i > 12)532 b = true;533 else534 b2 = false;535 536 // Unchanged: no else statement.537 bool b3;538 if (i > 15)539 b3 = true;540 541 // Unchanged: not boolean assignment.542 int j;543 if (i > 17)544 j = 10;545 else546 j = 20;547 548 // Unchanged: different variables assigned.549 int k = 0;550 bool b4 = false;551 if (i > 10)552 b4 = true;553 else554 k = 10;555}556 557void complex_conditional_assignment_statements(int i) {558 bool d;559 if (i > 30) {560 d = true;561 } else {562 d = false;563 }564 d = false;565 // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment566 // CHECK-FIXES: bool d;567 // CHECK-FIXES: {{^ }}d = i > 30;{{$}}568 // CHECK-FIXES: d = false;569 570 bool e;571 if (i > 40) {572 e = false;573 } else {574 e = true;575 }576 e = false;577 // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment578 // CHECK-FIXES: bool e;579 // CHECK-FIXES: {{^ }}e = i <= 40;{{$}}580 // CHECK-FIXES: e = false;581 582 // Unchanged: no else statement.583 bool b3;584 if (i > 15) {585 b3 = true;586 }587 588 // Unchanged: not a boolean assignment.589 int j;590 if (i > 17) {591 j = 10;592 } else {593 j = 20;594 }595 596 // Unchanged: multiple statements.597 bool f;598 if (j > 10) {599 j = 10;600 f = true;601 } else {602 j = 20;603 f = false;604 }605 606 // Unchanged: multiple statements.607 bool g;608 if (j > 10)609 g = true;610 else {611 j = 20;612 g = false;613 }614 615 // Unchanged: multiple statements.616 bool h;617 if (j > 10) {618 j = 10;619 h = true;620 } else621 h = false;622 623 // Unchanged: condition variable.624 bool k;625 if (bool Res = j > 10)626 k = true;627 else628 k = false;629}630 631// Unchanged: chained return statements, but ChainedConditionalReturn not set.632bool chained_conditional_compound_return(int i) {633 if (i < 0) {634 return true;635 } else if (i < 10) {636 return false;637 } else if (i > 20) {638 return true;639 } else {640 return false;641 }642}643 644// Unchanged: chained return statements, but ChainedConditionalReturn not set.645bool chained_conditional_return(int i) {646 if (i < 0)647 return true;648 else if (i < 10)649 return false;650 else if (i > 20)651 return true;652 else653 return false;654}655 656// Unchanged: chained assignments, but ChainedConditionalAssignment not set.657void chained_conditional_compound_assignment(int i) {658 bool b;659 if (i < 0) {660 b = true;661 } else if (i < 10) {662 b = false;663 } else if (i > 20) {664 b = true;665 } else {666 b = false;667 }668}669 670// Unchanged: chained return statements, but ChainedConditionalReturn not set.671void chained_conditional_assignment(int i) {672 bool b;673 if (i < 0)674 b = true;675 else if (i < 10)676 b = false;677 else if (i > 20)678 b = true;679 else680 b = false;681}682 683// Unchanged: chained return statements, but ChainedConditionalReturn not set.684bool chained_simple_if_return_negated(int i) {685 if (i < 5)686 return false;687 if (i > 10)688 return false;689 return true;690}691 692// Unchanged: chained return statements, but ChainedConditionalReturn not set.693bool complex_chained_if_return_return(int i) {694 if (i < 5) {695 return true;696 }697 if (i > 10) {698 return true;699 }700 return false;701}702 703// Unchanged: chained return statements, but ChainedConditionalReturn not set.704bool complex_chained_if_return_return_negated(int i) {705 if (i < 5) {706 return false;707 }708 if (i > 10) {709 return false;710 }711 return true;712}713 714// Unchanged: chained return statements, but ChainedConditionalReturn not set.715bool chained_simple_if_return(int i) {716 if (i < 5)717 return true;718 if (i > 10)719 return true;720 return false;721}722 723bool simple_if_return_return(int i) {724 if (i > 10)725 return true;726 return false;727}728// CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return729// CHECK-FIXES: {{^}}bool simple_if_return_return(int i) {{{$}}730// CHECK-FIXES: {{^ return i > 10;$}}731// CHECK-FIXES: {{^}$}}732 733bool simple_if_return_return_negated(int i) {734 if (i > 10)735 return false;736 return true;737}738// CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return739// CHECK-FIXES: {{^}}bool simple_if_return_return_negated(int i) {{{$}}740// CHECK-FIXES: {{^ return i <= 10;$}}741// CHECK-FIXES: {{^}$}}742 743bool complex_if_return_return(int i) {744 if (i > 10) {745 return true;746 }747 return false;748}749// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return750// CHECK-FIXES: {{^}}bool complex_if_return_return(int i) {{{$}}751// CHECK-FIXES: {{^ return i > 10;$}}752// CHECK-FIXES: {{^}$}}753 754bool complex_if_return_return_negated(int i) {755 if (i > 10) {756 return false;757 }758 return true;759}760// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return761// CHECK-FIXES: {{^}}bool complex_if_return_return_negated(int i) {{{$}}762// CHECK-FIXES: {{^ return i <= 10;$}}763// CHECK-FIXES: {{^}$}}764 765bool if_implicit_bool_expr(int i) {766 if (i & 1) {767 return true;768 } else {769 return false;770 }771}772// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return773// CHECK-FIXES: {{^}} return (i & 1) != 0;{{$}}774 775bool negated_if_implicit_bool_expr(int i) {776 if (i - 1) {777 return false;778 } else {779 return true;780 }781}782// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return783// CHECK-FIXES: {{^}} return (i - 1) == 0;{{$}}784 785bool implicit_int(int i) {786 if (i) {787 return true;788 } else {789 return false;790 }791}792// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return793// CHECK-FIXES: {{^}} return i != 0;{{$}}794 795bool explicit_bool(bool b) {796 if (b) {797 return true;798 } else {799 return false;800 }801}802// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return803// CHECK-FIXES: {{^}} return b;{{$}}804 805class Implicit {806public:807 operator bool() {808 return true;809 }810};811 812bool object_bool_implicit_conversion(Implicit O) {813 if (O) {814 return true;815 } else {816 return false;817 }818}819// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return820// CHECK-FIXES: {{^}} return O;{{$}}821 822bool negated_explicit_bool(bool b) {823 if (!b) {824 return true;825 } else {826 return false;827 }828}829// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return830// CHECK-FIXES: {{^}} return !b;{{$}}831 832bool bitwise_complement_conversion(int i) {833 if (~i) {834 return true;835 } else {836 return false;837 }838}839// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return840// CHECK-FIXES: {{^}} return ~i != 0;{{$}}841 842bool logical_or(bool a, bool b) {843 if (a || b) {844 return true;845 } else {846 return false;847 }848}849// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return850// CHECK-FIXES: {{^}} return a || b;{{$}}851 852bool logical_and(bool a, bool b) {853 if (a && b) {854 return true;855 } else {856 return false;857 }858}859// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return860// CHECK-FIXES: {{^}} return a && b;{{$}}861 862class Comparable863{864public:865 bool operator==(Comparable const &rhs) { return true; }866 bool operator!=(Comparable const &rhs) { return false; }867};868 869bool comparable_objects() {870 Comparable c;871 Comparable d;872 if (c == d) {873 return true;874 } else {875 return false;876 }877}878// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return879// CHECK-FIXES: {{^}} return c == d;{{$}}880 881bool negated_comparable_objects() {882 Comparable c;883 Comparable d;884 if (c == d) {885 return false;886 } else {887 return true;888 }889}890// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return891// CHECK-FIXES: {{^}} return c != d;{{$}}892 893struct X {894 explicit operator bool();895};896 897void explicit_conversion_assignment(X x) {898 bool y;899 if (x) {900 y = true;901 } else {902 y = false;903 }904}905// CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment906// CHECK-FIXES: {{^ bool y;$}}907// CHECK-FIXES: {{^}} y = static_cast<bool>(x);{{$}}908 909void ternary_integer_condition(int i) {910 bool b = i ? true : false;911}912// CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result913// CHECK-FIXES: bool b = i != 0;{{$}}914 915bool non_null_pointer_condition(int *p1) {916 if (p1) {917 return true;918 } else {919 return false;920 }921}922// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return923// CHECK-FIXES: return p1 != nullptr;{{$}}924 925bool null_pointer_condition(int *p2) {926 if (!p2) {927 return true;928 } else {929 return false;930 }931}932// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return933// CHECK-FIXES: return p2 == nullptr;{{$}}934 935bool negated_non_null_pointer_condition(int *p3) {936 if (p3) {937 return false;938 } else {939 return true;940 }941}942// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return943// CHECK-FIXES: return p3 == nullptr;{{$}}944 945bool negated_null_pointer_condition(int *p4) {946 if (!p4) {947 return false;948 } else {949 return true;950 }951}952// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return953// CHECK-FIXES: return p4 != nullptr;{{$}}954 955bool comments_in_the_middle(bool b) {956 if (b) {957 return true;958 } else {959 // something wicked this way comes960 return false;961 }962}963// CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return964// CHECK-FIXES: {{^}} if (b) {965// CHECK-FIXES: // something wicked this way comes{{$}}966 967bool preprocessor_in_the_middle(bool b) {968 if (b) {969 return true;970 } else {971#define SOMETHING_WICKED false972 return false;973 }974}975// CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return976// CHECK-FIXES: {{^}} if (b) {977// CHECK-FIXES: {{^}}#define SOMETHING_WICKED false978 979bool integer_not_zero(int i) {980 if (i) {981 return false;982 } else {983 return true;984 }985}986// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return987// CHECK-FIXES: {{^}} return i == 0;{{$}}988 989class A {990public:991 int m;992};993 994bool member_pointer_nullptr(int A::*p) {995 if (p) {996 return true;997 } else {998 return false;999 }1000}1001// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return1002// CHECK-FIXES: return p != nullptr;{{$}}1003 1004bool integer_member_implicit_cast(A *p) {1005 if (p->m) {1006 return true;1007 } else {1008 return false;1009 }1010}1011// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return1012// CHECK-FIXES: return p->m != 0;{{$}}1013 1014bool operator!=(const A&, const A&) { return false; }1015bool expr_with_cleanups(A &S) {1016 if (S != (A)S)1017 return false;1018 1019 return true;1020}1021// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return1022// CHECK-FIXES: return S == (A)S;{{$}}1023 1024template <bool B>1025void ignoreInstantiations() {1026 if (B) {1027 return;1028 } else {1029 return;1030 }1031}1032 1033void instantiate() {1034 // Just make sure the check isn't fooled by template instantiations.1035 ignoreInstantiations<true>();1036 ignoreInstantiations<false>();1037}1038