1400 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-redundant-branch-condition %t \2// RUN: -- -- -fblocks3 4extern unsigned peopleInTheBuilding;5extern unsigned fireFighters;6 7bool isBurning();8bool isReallyBurning();9bool isCollapsing();10bool tryToExtinguish(bool&);11bool tryToExtinguishByVal(bool);12void tryPutFireOut();13bool callTheFD();14void scream();15 16bool someOtherCondition();17 18//===--- Basic Positives --------------------------------------------------===//19 20void positive_direct() {21 bool onFire = isBurning();22 if (onFire) {23 if (onFire) {24 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]25 // CHECK-FIXES: {{^\ *$}}26 scream();27 }28 // CHECK-FIXES: {{^\ *$}}29 }30}31 32void positive_indirect() {33 bool onFire = isBurning();34 if (onFire) {35 if (someOtherCondition()) {36 if (onFire)37 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]38 // CHECK-FIXES: {{^\ *$}}39 scream();40 }41 }42}43 44void positive_direct_inner_and_lhs() {45 bool onFire = isBurning();46 if (onFire) {47 if (onFire && peopleInTheBuilding > 0) {48 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]49 // CHECK-FIXES: if ( peopleInTheBuilding > 0) {50 scream();51 }52 }53}54 55void positive_indirect_inner_and_lhs() {56 bool onFire = isBurning();57 if (onFire) {58 if (someOtherCondition()) {59 if (onFire && peopleInTheBuilding > 0) {60 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]61 // CHECK-FIXES: if ( peopleInTheBuilding > 0) {62 scream();63 }64 }65 }66}67 68void positive_direct_inner_and_rhs() {69 bool onFire = isBurning();70 if (onFire) {71 if (peopleInTheBuilding > 0 && onFire) {72 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]73 // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {74 scream();75 }76 }77}78 79void positive_indirect_inner_and_rhs() {80 bool onFire = isBurning();81 if (onFire) {82 if (someOtherCondition()) {83 if (peopleInTheBuilding > 0 && onFire) {84 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]85 // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {86 scream();87 }88 }89 }90}91 92void positive_direct_inner_or_lhs() {93 bool onFire = isBurning();94 if (onFire) {95 if (onFire || isCollapsing()) {96 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]97 // CHECK-FIXES: {{^\ *$}}98 scream();99 }100 // CHECK-FIXES: {{^\ *$}}101 }102}103 104void positive_indirect_inner_or_lhs() {105 bool onFire = isBurning();106 if (onFire) {107 if (someOtherCondition()) {108 if (onFire || isCollapsing()) {109 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]110 // CHECK-FIXES: {{^\ *$}}111 scream();112 }113 // CHECK-FIXES: {{^\ *$}}114 }115 }116}117 118void positive_direct_inner_or_rhs() {119 bool onFire = isBurning();120 if (onFire) {121 if (isCollapsing() || onFire) {122 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]123 // CHECK-FIXES: {{^\ *$}}124 scream();125 }126 // CHECK-FIXES: {{^\ *$}}127 }128}129 130void positive_indirect_inner_or_rhs() {131 bool onFire = isBurning();132 if (onFire) {133 if (someOtherCondition()) {134 if (isCollapsing() || onFire) {135 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]136 // CHECK-FIXES: {{^\ *$}}137 scream();138 }139 // CHECK-FIXES: {{^\ *$}}140 }141 }142}143 144void positive_direct_outer_and_lhs() {145 bool onFire = isBurning();146 if (onFire && fireFighters < 10) {147 if (onFire) {148 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]149 // CHECK-FIXES: {{^\ *$}}150 scream();151 }152 // CHECK-FIXES: {{^\ *$}}153 }154}155 156void positive_indirect_outer_and_lhs() {157 bool onFire = isBurning();158 if (onFire && fireFighters < 10) {159 if (someOtherCondition()) {160 if (onFire) {161 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]162 // CHECK-FIXES: {{^\ *$}}163 scream();164 }165 // CHECK-FIXES: {{^\ *$}}166 }167 }168}169 170void positive_direct_outer_and_lhs_inner_and_lhs() {171 bool onFire = isBurning();172 if (onFire && fireFighters < 10) {173 if (onFire && peopleInTheBuilding > 0) {174 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]175 // CHECK-FIXES: if ( peopleInTheBuilding > 0) {176 scream();177 }178 }179}180 181void positive_indirect_outer_and_lhs_inner_and_lhs() {182 bool onFire = isBurning();183 if (onFire && fireFighters < 10) {184 if (someOtherCondition()) {185 if (onFire && peopleInTheBuilding > 0) {186 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]187 // CHECK-FIXES: if ( peopleInTheBuilding > 0) {188 scream();189 }190 }191 }192}193 194void positive_direct_outer_and_lhs_inner_and_rhs() {195 bool onFire = isBurning();196 if (onFire && fireFighters < 10) {197 if (peopleInTheBuilding > 0 && onFire) {198 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]199 // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {200 scream();201 }202 }203}204 205void positive_indirect_outer_and_lhs_inner_and_rhs() {206 bool onFire = isBurning();207 if (onFire && fireFighters < 10) {208 if (someOtherCondition()) {209 if (peopleInTheBuilding > 0 && onFire) {210 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]211 // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {212 scream();213 }214 }215 }216}217 218void positive_direct_outer_and_lhs_inner_or_lhs() {219 bool onFire = isBurning();220 if (onFire && fireFighters < 10) {221 if (onFire || isCollapsing()) {222 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]223 // CHECK-FIXES: {{^\ *$}}224 scream();225 }226 // CHECK-FIXES: {{^\ *$}}227 }228}229 230void positive_indirect_outer_and_lhs_inner_or_lhs() {231 bool onFire = isBurning();232 if (onFire && fireFighters < 10) {233 if (someOtherCondition()) {234 if (onFire || isCollapsing()) {235 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]236 // CHECK-FIXES: {{^\ *$}}237 scream();238 }239 // CHECK-FIXES: {{^\ *$}}240 }241 }242}243 244void positive_direct_outer_and_lhs_inner_or_rhs() {245 bool onFire = isBurning();246 if (onFire && fireFighters < 10) {247 if (isCollapsing() || onFire) {248 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]249 // CHECK-FIXES: {{^\ *$}}250 scream();251 }252 // CHECK-FIXES: {{^\ *$}}253 }254}255 256void positive_indirect_outer_and_lhs_inner_or_rhs() {257 bool onFire = isBurning();258 if (onFire && fireFighters < 10) {259 if (someOtherCondition()) {260 if (isCollapsing() || onFire) {261 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]262 // CHECK-FIXES: {{^\ *$}}263 scream();264 }265 // CHECK-FIXES: {{^\ *$}}266 }267 }268}269 270void positive_direct_outer_and_rhs() {271 bool onFire = isBurning();272 if (fireFighters < 10 && onFire) {273 if (onFire) {274 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]275 // CHECK-FIXES: {{^\ *$}}276 scream();277 }278 // CHECK-FIXES: {{^\ *$}}279 }280}281 282void positive_indirect_outer_and_rhs() {283 bool onFire = isBurning();284 if (fireFighters < 10 && onFire) {285 if (someOtherCondition()) {286 if (onFire) {287 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]288 // CHECK-FIXES: {{^\ *$}}289 scream();290 }291 // CHECK-FIXES: {{^\ *$}}292 }293 }294}295 296void positive_direct_outer_and_rhs_inner_and_lhs() {297 bool onFire = isBurning();298 if (fireFighters < 10 && onFire) {299 if (onFire && peopleInTheBuilding > 0) {300 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]301 // CHECK-FIXES: if ( peopleInTheBuilding > 0) {302 scream();303 }304 }305}306 307void positive_indirect_outer_and_rhs_inner_and_lhs() {308 bool onFire = isBurning();309 if (fireFighters < 10 && onFire) {310 if (someOtherCondition()) {311 if (onFire && peopleInTheBuilding > 0) {312 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]313 // CHECK-FIXES: if ( peopleInTheBuilding > 0) {314 scream();315 }316 }317 }318}319 320void positive_direct_inner_outer_and_rhs_and_rhs() {321 bool onFire = isBurning();322 if (fireFighters < 10 && onFire) {323 if (peopleInTheBuilding > 0 && onFire) {324 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]325 // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {326 scream();327 }328 }329}330 331void positive_indirect_outer_and_rhs_inner_and_rhs() {332 bool onFire = isBurning();333 if (fireFighters < 10 && onFire) {334 if (someOtherCondition()) {335 if (peopleInTheBuilding > 0 && onFire) {336 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]337 // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {338 scream();339 }340 }341 }342}343 344void positive_direct_outer_and_rhs_inner_or_lhs() {345 bool onFire = isBurning();346 if (fireFighters < 10 && onFire) {347 if (onFire || isCollapsing()) {348 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]349 // CHECK-FIXES: {{^\ *$}}350 scream();351 }352 // CHECK-FIXES: {{^\ *$}}353 }354}355 356void positive_indirect_outer_and_rhs_inner_or_lhs() {357 bool onFire = isBurning();358 if (fireFighters < 10 && onFire) {359 if (someOtherCondition()) {360 if (onFire || isCollapsing()) {361 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]362 // CHECK-FIXES: {{^\ *$}}363 scream();364 }365 // CHECK-FIXES: {{^\ *$}}366 }367 }368}369 370void positive_direct_outer_and_rhs_inner_or_rhs() {371 bool onFire = isBurning();372 if (fireFighters < 10 && onFire) {373 if (isCollapsing() || onFire) {374 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]375 // CHECK-FIXES: {{^\ *$}}376 scream();377 }378 // CHECK-FIXES: {{^\ *$}}379 }380}381 382void positive_indirect_outer_and_rhs_inner_or_rhs() {383 bool onFire = isBurning();384 if (fireFighters < 10 && onFire) {385 if (someOtherCondition()) {386 if (isCollapsing() || onFire) {387 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]388 // CHECK-FIXES: {{^\ *$}}389 scream();390 }391 // CHECK-FIXES: {{^\ *$}}392 }393 }394}395 396//===--- Basic Negatives --------------------------------------------------===//397 398void negative_direct() {399 bool onFire = isBurning();400 if (onFire) {401 tryToExtinguish(onFire);402 if (onFire) {403 // NO-MESSAGE: fire may have been extinguished404 scream();405 }406 }407}408 409void negative_indirect() {410 bool onFire = isBurning();411 if (onFire) {412 tryToExtinguish(onFire);413 if (someOtherCondition()) {414 if (onFire) {415 // NO-MESSAGE: fire may have been extinguished416 scream();417 }418 }419 }420}421 422void negative_indirect2() {423 bool onFire = isBurning();424 if (onFire) {425 if (someOtherCondition()) {426 tryToExtinguish(onFire);427 if (onFire) {428 // NO-MESSAGE: fire may have been extinguished429 scream();430 }431 }432 }433}434 435void negative_direct_inner_and_lhs() {436 bool onFire = isBurning();437 if (onFire) {438 tryToExtinguish(onFire);439 if (onFire && peopleInTheBuilding > 0) {440 // NO-MESSAGE: fire may have been extinguished441 scream();442 }443 }444}445 446void negative_indirect_inner_and_lhs() {447 bool onFire = isBurning();448 if (onFire) {449 tryToExtinguish(onFire);450 if (someOtherCondition()) {451 if (onFire && peopleInTheBuilding > 0) {452 // NO-MESSAGE: fire may have been extinguished453 scream();454 }455 }456 }457}458 459void negative_indirect2_inner_and_lhs() {460 bool onFire = isBurning();461 if (onFire) {462 if (someOtherCondition()) {463 tryToExtinguish(onFire);464 if (onFire && peopleInTheBuilding > 0) {465 // NO-MESSAGE: fire may have been extinguished466 scream();467 }468 }469 }470}471 472void negative_direct_inner_and_rhs() {473 bool onFire = isBurning();474 if (onFire) {475 tryToExtinguish(onFire);476 if (peopleInTheBuilding > 0 && onFire) {477 // NO-MESSAGE: fire may have been extinguished478 scream();479 }480 }481}482 483void negative_indirect_inner_and_rhs() {484 bool onFire = isBurning();485 if (onFire) {486 tryToExtinguish(onFire);487 if (someOtherCondition()) {488 if (peopleInTheBuilding > 0 && onFire) {489 // NO-MESSAGE: fire may have been extinguished490 scream();491 }492 }493 }494}495 496void negative_indirect2_inner_and_rhs() {497 bool onFire = isBurning();498 if (onFire) {499 if (someOtherCondition()) {500 tryToExtinguish(onFire);501 if (peopleInTheBuilding > 0 && onFire) {502 // NO-MESSAGE: fire may have been extinguished503 scream();504 }505 }506 }507}508 509void negative_direct_inner_or_lhs() {510 bool onFire = isBurning();511 if (onFire) {512 tryToExtinguish(onFire);513 if (onFire || isCollapsing()) {514 // NO-MESSAGE: fire may have been extinguished515 scream();516 }517 }518}519 520void negative_indirect_inner_or_lhs() {521 bool onFire = isBurning();522 if (onFire) {523 tryToExtinguish(onFire);524 if (someOtherCondition()) {525 if (onFire || isCollapsing()) {526 // NO-MESSAGE: fire may have been extinguished527 scream();528 }529 }530 }531}532 533void negative_indirect2_inner_or_lhs() {534 bool onFire = isBurning();535 if (onFire) {536 if (someOtherCondition()) {537 tryToExtinguish(onFire);538 if (onFire || isCollapsing()) {539 // NO-MESSAGE: fire may have been extinguished540 scream();541 }542 }543 }544}545 546void negative_direct_inner_or_rhs() {547 bool onFire = isBurning();548 if (onFire) {549 tryToExtinguish(onFire);550 if (isCollapsing() || onFire) {551 // NO-MESSAGE: fire may have been extinguished552 scream();553 }554 }555}556 557void negative_indirect_inner_or_rhs() {558 bool onFire = isBurning();559 if (onFire) {560 tryToExtinguish(onFire);561 if (someOtherCondition()) {562 if (isCollapsing() || onFire) {563 // NO-MESSAGE: fire may have been extinguished564 scream();565 }566 }567 }568}569 570void negative_indirect2_inner_or_rhs() {571 bool onFire = isBurning();572 if (onFire) {573 if (someOtherCondition()) {574 tryToExtinguish(onFire);575 if (isCollapsing() || onFire) {576 // NO-MESSAGE: fire may have been extinguished577 scream();578 }579 }580 }581}582 583void negative_direct_outer_and_lhs() {584 bool onFire = isBurning();585 if (onFire && fireFighters < 10) {586 tryToExtinguish(onFire);587 if (onFire) {588 // NO-MESSAGE: fire may have been extinguished589 scream();590 }591 }592}593 594void negative_indirect_outer_and_lhs() {595 bool onFire = isBurning();596 if (onFire && fireFighters < 10) {597 tryToExtinguish(onFire);598 if (someOtherCondition()) {599 if (onFire) {600 // NO-MESSAGE: fire may have been extinguished601 scream();602 }603 }604 }605}606 607void negative_indirect2_outer_and_lhs() {608 bool onFire = isBurning();609 if (onFire && fireFighters < 10) {610 if (someOtherCondition()) {611 tryToExtinguish(onFire);612 if (onFire) {613 // NO-MESSAGE: fire may have been extinguished614 scream();615 }616 }617 }618}619 620void negative_direct_outer_and_lhs_inner_and_lhs() {621 bool onFire = isBurning();622 if (onFire && fireFighters < 10) {623 tryToExtinguish(onFire);624 if (onFire && peopleInTheBuilding > 0) {625 // NO-MESSAGE: fire may have been extinguished626 scream();627 }628 }629}630 631void negative_indirect_outer_and_lhs_inner_and_lhs() {632 bool onFire = isBurning();633 if (onFire && fireFighters < 10) {634 tryToExtinguish(onFire);635 if (someOtherCondition()) {636 if (onFire && peopleInTheBuilding > 0) {637 // NO-MESSAGE: fire may have been extinguished638 scream();639 }640 }641 }642}643 644void negative_indirect2_outer_and_lhs_inner_and_lhs() {645 bool onFire = isBurning();646 if (onFire && fireFighters < 10) {647 if (someOtherCondition()) {648 tryToExtinguish(onFire);649 if (onFire && peopleInTheBuilding > 0) {650 // NO-MESSAGE: fire may have been extinguished651 scream();652 }653 }654 }655}656 657void negative_direct_outer_and_lhs_inner_and_rhs() {658 bool onFire = isBurning();659 if (onFire && fireFighters < 10) {660 tryToExtinguish(onFire);661 if (peopleInTheBuilding > 0 && onFire) {662 // NO-MESSAGE: fire may have been extinguished663 scream();664 }665 }666}667 668void negative_indirect_outer_and_lhs_inner_and_rhs() {669 bool onFire = isBurning();670 if (onFire && fireFighters < 10) {671 tryToExtinguish(onFire);672 if (someOtherCondition()) {673 if (peopleInTheBuilding > 0 && onFire) {674 // NO-MESSAGE: fire may have been extinguished675 scream();676 }677 }678 }679}680 681void negative_indirect2_outer_and_lhs_inner_and_rhs() {682 bool onFire = isBurning();683 if (onFire && fireFighters < 10) {684 if (someOtherCondition()) {685 tryToExtinguish(onFire);686 if (peopleInTheBuilding > 0 && onFire) {687 // NO-MESSAGE: fire may have been extinguished688 scream();689 }690 }691 }692}693 694void negative_direct_outer_and_lhs_inner_or_lhs() {695 bool onFire = isBurning();696 if (onFire && fireFighters < 10) {697 tryToExtinguish(onFire);698 if (onFire || isCollapsing()) {699 // NO-MESSAGE: fire may have been extinguished700 scream();701 }702 }703}704 705void negative_indirect_outer_and_lhs_inner_or_lhs() {706 bool onFire = isBurning();707 if (onFire && fireFighters < 10) {708 tryToExtinguish(onFire);709 if (someOtherCondition()) {710 if (onFire || isCollapsing()) {711 // NO-MESSAGE: fire may have been extinguished712 scream();713 }714 }715 }716}717 718void negative_indirect2_outer_and_lhs_inner_or_lhs() {719 bool onFire = isBurning();720 if (onFire && fireFighters < 10) {721 if (someOtherCondition()) {722 tryToExtinguish(onFire);723 if (onFire || isCollapsing()) {724 // NO-MESSAGE: fire may have been extinguished725 scream();726 }727 }728 }729}730 731void negative_direct_outer_and_lhs_inner_or_rhs() {732 bool onFire = isBurning();733 if (onFire && fireFighters < 10) {734 tryToExtinguish(onFire);735 if (isCollapsing() || onFire) {736 // NO-MESSAGE: fire may have been extinguished737 scream();738 }739 }740}741 742void negative_indirect_outer_and_lhs_inner_or_rhs() {743 bool onFire = isBurning();744 if (onFire && fireFighters < 10) {745 tryToExtinguish(onFire);746 if (someOtherCondition()) {747 if (isCollapsing() || onFire) {748 // NO-MESSAGE: fire may have been extinguished749 scream();750 }751 }752 }753}754 755void negative_indirect2_outer_and_lhs_inner_or_rhs() {756 bool onFire = isBurning();757 if (onFire && fireFighters < 10) {758 if (someOtherCondition()) {759 tryToExtinguish(onFire);760 if (isCollapsing() || onFire) {761 // NO-MESSAGE: fire may have been extinguished762 scream();763 }764 }765 }766}767 768void negative_direct_outer_and_rhs() {769 bool onFire = isBurning();770 if (fireFighters < 10 && onFire) {771 tryToExtinguish(onFire);772 if (onFire) {773 // NO-MESSAGE: fire may have been extinguished774 scream();775 }776 }777}778 779void negative_indirect_outer_and_rhs() {780 bool onFire = isBurning();781 if (fireFighters < 10 && onFire) {782 tryToExtinguish(onFire);783 if (someOtherCondition()) {784 if (onFire) {785 // NO-MESSAGE: fire may have been extinguished786 scream();787 }788 }789 }790}791 792void negative_indirect2_outer_and_rhs() {793 bool onFire = isBurning();794 if (fireFighters < 10 && onFire) {795 if (someOtherCondition()) {796 tryToExtinguish(onFire);797 if (onFire) {798 // NO-MESSAGE: fire may have been extinguished799 scream();800 }801 }802 }803}804 805void negative_direct_outer_and_rhs_inner_and_lhs() {806 bool onFire = isBurning();807 if (fireFighters < 10 && onFire) {808 tryToExtinguish(onFire);809 if (onFire && peopleInTheBuilding > 0) {810 // NO-MESSAGE: fire may have been extinguished811 scream();812 }813 }814}815 816void negative_indirect_outer_and_rhs_inner_and_lhs() {817 bool onFire = isBurning();818 if (fireFighters < 10 && onFire) {819 tryToExtinguish(onFire);820 if (someOtherCondition()) {821 if (onFire && peopleInTheBuilding > 0) {822 // NO-MESSAGE: fire may have been extinguished823 scream();824 }825 }826 }827}828 829void negative_indirect2_outer_and_rhs_inner_and_lhs() {830 bool onFire = isBurning();831 if (fireFighters < 10 && onFire) {832 if (someOtherCondition()) {833 tryToExtinguish(onFire);834 if (onFire && peopleInTheBuilding > 0) {835 // NO-MESSAGE: fire may have been extinguished836 scream();837 }838 }839 }840}841 842void negative_direct_inner_outer_and_rhs_and_rhs() {843 bool onFire = isBurning();844 if (fireFighters < 10 && onFire) {845 tryToExtinguish(onFire);846 if (peopleInTheBuilding > 0 && onFire) {847 // NO-MESSAGE: fire may have been extinguished848 scream();849 }850 }851}852 853void negative_indirect_outer_and_rhs_inner_and_rhs() {854 bool onFire = isBurning();855 if (fireFighters < 10 && onFire) {856 tryToExtinguish(onFire);857 if (someOtherCondition()) {858 if (peopleInTheBuilding > 0 && onFire) {859 // NO-MESSAGE: fire may have been extinguished860 scream();861 }862 }863 }864}865 866void negative_indirect2_outer_and_rhs_inner_and_rhs() {867 bool onFire = isBurning();868 if (fireFighters < 10 && onFire) {869 if (someOtherCondition()) {870 tryToExtinguish(onFire);871 if (peopleInTheBuilding > 0 && onFire) {872 // NO-MESSAGE: fire may have been extinguished873 scream();874 }875 }876 }877}878 879void negative_direct_outer_and_rhs_inner_or_lhs() {880 bool onFire = isBurning();881 if (fireFighters < 10 && onFire) {882 tryToExtinguish(onFire);883 if (onFire || isCollapsing()) {884 // NO-MESSAGE: fire may have been extinguished885 scream();886 }887 }888}889 890void negative_indirect_outer_and_rhs_inner_or_lhs() {891 bool onFire = isBurning();892 if (fireFighters < 10 && onFire) {893 tryToExtinguish(onFire);894 if (someOtherCondition()) {895 if (onFire || isCollapsing()) {896 // NO-MESSAGE: fire may have been extinguished897 scream();898 }899 }900 }901}902 903void negative_indirect2_outer_and_rhs_inner_or_lhs() {904 bool onFire = isBurning();905 if (fireFighters < 10 && onFire) {906 if (someOtherCondition()) {907 tryToExtinguish(onFire);908 if (onFire || isCollapsing()) {909 // NO-MESSAGE: fire may have been extinguished910 scream();911 }912 }913 }914}915 916void negative_direct_outer_and_rhs_inner_or_rhs() {917 bool onFire = isBurning();918 if (fireFighters < 10 && onFire) {919 tryToExtinguish(onFire);920 if (isCollapsing() || onFire) {921 // NO-MESSAGE: fire may have been extinguished922 scream();923 }924 }925}926 927void negative_indirect_outer_and_rhs_inner_or_rhs() {928 bool onFire = isBurning();929 if (fireFighters < 10 && onFire) {930 tryToExtinguish(onFire);931 if (someOtherCondition()) {932 if (isCollapsing() || onFire) {933 // NO-MESSAGE: fire may have been extinguished934 scream();935 }936 }937 }938}939 940void negative_indirect2_outer_and_rhs_inner_or_rhs() {941 bool onFire = isBurning();942 if (fireFighters < 10 && onFire) {943 if (someOtherCondition()) {944 tryToExtinguish(onFire);945 if (isCollapsing() || onFire) {946 // NO-MESSAGE: fire may have been extinguished947 scream();948 }949 }950 }951}952 953void negative_by_ref(bool onFire) {954 if (tryToExtinguish(onFire) && onFire) {955 if (tryToExtinguish(onFire) && onFire) {956 // NO-MESSAGE: fire may have been extinguished957 scream();958 }959 }960}961 962void negative_by_val(bool onFire) {963 if (tryToExtinguishByVal(onFire) && onFire) {964 if (tryToExtinguish(onFire) && onFire) {965 // NO-MESSAGE: fire may have been extinguished966 scream();967 }968 }969 if (tryToExtinguish(onFire) && onFire) {970 if (tryToExtinguishByVal(onFire) && onFire) {971 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]972 scream();973 }974 }975}976 977void negative_reassigned() {978 bool onFire = isBurning();979 if (onFire) {980 onFire = isReallyBurning();981 if (onFire) {982 // NO-MESSAGE: it was a false alarm then983 scream();984 }985 }986}987 988//===--- Special Positives ------------------------------------------------===//989 990// Condition variable mutated in or after the inner loop991 992void positive_direct_mutated_after_inner() {993 bool onFire = isBurning();994 if (onFire) {995 if (onFire) {996 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]997 // CHECK-FIXES: {{^\ *$}}998 scream();999 }1000 // CHECK-FIXES: {{^\ *$}}1001 tryToExtinguish(onFire);1002 }1003}1004 1005void positive_indirect_mutated_after_inner() {1006 bool onFire = isBurning();1007 if (onFire) {1008 if (someOtherCondition()) {1009 if (onFire) {1010 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1011 // CHECK-FIXES: {{^\ *$}}1012 scream();1013 }1014 // CHECK-FIXES: {{^\ *$}}1015 }1016 tryToExtinguish(onFire);1017 }1018}1019 1020void positive_indirect2_mutated_after_inner() {1021 bool onFire = isBurning();1022 if (onFire) {1023 if (someOtherCondition()) {1024 if (onFire) {1025 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1026 // CHECK-FIXES: {{^\ *$}}1027 scream();1028 }1029 // CHECK-FIXES: {{^\ *$}}1030 tryToExtinguish(onFire);1031 }1032 }1033}1034 1035void positive_mutated_in_inner() {1036 bool onFire = isBurning();1037 if (onFire) {1038 if (onFire) {1039 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1040 // CHECK-FIXES: {{^\ *$}}1041 tryToExtinguish(onFire);1042 scream();1043 }1044 // CHECK-FIXES: {{^\ *$}}1045 }1046}1047 1048void positive_or_lhs_with_side_effect() {1049 bool onFire = isBurning();1050 if (onFire) {1051 if (callTheFD() || onFire) {1052 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1053 // CHECK-FIXES: callTheFD() ;1054 scream();1055 }1056 // CHECK-FIXES: {{^\ *$}}1057 }1058}1059 1060void positive_or_rhs_with_side_effect() {1061 bool onFire = isBurning();1062 if (onFire) {1063 if (onFire || callTheFD()) {1064 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1065 // CHECK-FIXES: callTheFD();1066 scream();1067 }1068 // CHECK-FIXES: {{^\ *$}}1069 }1070}1071 1072// GNU Expression Statements1073 1074void doSomething();1075 1076void positive_gnu_expression_statement() {1077 bool onFire = isBurning();1078 if (({ doSomething(); onFire; })) {1079 if (({ doSomething(); onFire; })) {1080 // FIXME: Handle GNU epxression statements1081 // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1082 // CHCK-FIXES-NOT: doSomething();1083 scream();1084 }1085 }1086}1087 1088// Comma after Condition1089 1090void positive_comma_after_condition() {1091 bool onFire = isBurning();1092 if (doSomething(), onFire) {1093 if (doSomething(), onFire) {1094 // FIXME: Handle comma operator1095 // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]1096 // CHCK-FIXES-NOT: doSomething();1097 scream();1098 }1099 }1100}1101 1102// ExprWithCleanups doesn't crash1103int positive_expr_with_cleanups() {1104 class RetT {1105 public:1106 RetT(const int code);1107 bool Ok() const;1108 static RetT Test(bool isSet);1109 1110 private:1111 int code_;1112 };1113 1114 bool isSet = false;1115 if (RetT::Test(isSet).Ok() && isSet) {1116 if (RetT::Test(isSet).Ok() && isSet) {1117 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'isSet' [bugprone-redundant-branch-condition]1118 // CHECK-FIXES: if (RetT::Test(isSet).Ok() ) {1119 }1120 }1121 if (isSet) {1122 if ((RetT::Test(isSet).Ok() && isSet)) {1123 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'isSet' [bugprone-redundant-branch-condition]1124 // CHECK-FIXES: if ((RetT::Test(isSet).Ok() )) {1125 }1126 }1127 return 0;1128}1129 1130//===--- Special Negatives ------------------------------------------------===//1131 1132// Aliasing1133 1134void negative_mutated_by_ptr() {1135 bool onFire = isBurning();1136 bool *firePtr = &onFire;1137 if (onFire) {1138 tryToExtinguish(*firePtr);1139 if (onFire) {1140 // NO-MESSAGE: fire may have been extinguished1141 scream();1142 }1143 }1144}1145 1146void negative_mutated_by_ref() {1147 bool onFire = isBurning();1148 bool &fireRef = onFire;1149 if (onFire) {1150 tryToExtinguish(fireRef);1151 if (onFire) {1152 // NO-MESSAGE: fire may have been extinguished1153 scream();1154 }1155 }1156}1157 1158// Volatile1159 1160void negatvie_volatile() {1161 bool volatile onFire = isBurning();1162 if (onFire) {1163 if (onFire) {1164 // NO-MESSAGE: maybe some other thread extinguished the fire1165 scream();1166 }1167 }1168}1169 1170void negative_else_branch(bool isHot) {1171 bool onFire = isBurning();1172 if (onFire) {1173 tryPutFireOut();1174 } else {1175 if (isHot && onFire) {1176 // NO-MESSAGE: new check is in the `else` branch1177 // FIXME: handle `else` branches and negated conditions1178 scream();1179 }1180 }1181}1182 1183// Lambda / block captures.1184 1185template <typename T> void accept_callback(T t) {1186 // Potentially call the callback.1187 // Possibly on a background thread or something.1188}1189 1190void accept_block(void (^)(void)) {1191 // Potentially call the callback.1192 // Possibly on a background thread or something.1193}1194 1195void wait(void) {1196 // Wait for the previously passed callback to be called.1197}1198 1199void capture_and_mutate_by_lambda() {1200 bool x = true;1201 accept_callback([&]() { x = false; });1202 if (x) {1203 wait();1204 if (x) {1205 }1206 }1207}1208 1209void lambda_capture_by_value() {1210 bool x = true;1211 accept_callback([x]() { if (x) {} });1212 if (x) {1213 wait();1214 if (x) {1215 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'x' [bugprone-redundant-branch-condition]1216 }1217 }1218}1219 1220void capture_by_lambda_but_not_mutate() {1221 bool x = true;1222 accept_callback([&]() { if (x) {} });1223 if (x) {1224 wait();1225 // FIXME: Should warn.1226 if (x) {1227 }1228 }1229}1230 1231void capture_and_mutate_by_block() {1232 __block bool x = true;1233 accept_block(^{ x = false; });1234 if (x) {1235 wait();1236 if (x) {1237 }1238 }1239}1240 1241void block_capture_by_value() {1242 bool x = true;1243 accept_block(^{ if (x) {} });1244 if (x) {1245 wait();1246 if (x) {1247 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'x' [bugprone-redundant-branch-condition]1248 }1249 }1250}1251 1252void capture_by_block_but_not_mutate() {1253 __block bool x = true;1254 accept_callback(^{ if (x) {} });1255 if (x) {1256 wait();1257 // FIXME: Should warn.1258 if (x) {1259 }1260 }1261}1262 1263void mutate_at_any_time(bool *x);1264 1265void capture_with_branches_inside_lambda_bad() {1266 bool x = true;1267 accept_callback([=]() {1268 if (x) {1269 wait();1270 if (x) {1271 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'x' [bugprone-redundant-branch-condition]1272 }1273 }1274 });1275 mutate_at_any_time(&x);1276}1277 1278void capture_with_branches_inside_lambda_good() {1279 bool x = true;1280 accept_callback([&]() {1281 if (x) {1282 wait();1283 if (x) {1284 }1285 }1286 });1287 mutate_at_any_time(&x);1288}1289 1290void capture_with_branches_inside_block_bad() {1291 bool x = true;1292 accept_callback(^{1293 if (x) {1294 wait();1295 if (x) {1296 // FIXME: Should warn. It currently reacts to &x outside the block1297 // which ideally shouldn't have any effect.1298 }1299 }1300 });1301 mutate_at_any_time(&x);1302}1303 1304void capture_with_branches_inside_block_bad_simpler() {1305 bool x = true;1306 accept_callback(^{1307 if (x) {1308 wait();1309 if (x) {1310 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'x' [bugprone-redundant-branch-condition]1311 }1312 }1313 });1314}1315 1316void capture_with_branches_inside_block_good() {1317 __block bool x = true;1318 accept_callback(^{1319 if (x) {1320 wait();1321 if (x) {1322 }1323 }1324 });1325 mutate_at_any_time(&x);1326}1327 1328// GNU Expression Statements1329 1330void negative_gnu_expression_statement() {1331 bool onFire = isBurning();1332 if (({ doSomething(); onFire; })) {1333 tryToExtinguish(onFire);1334 if (({ doSomething(); onFire; })) {1335 // NO-MESSAGE: fire may have been extinguished1336 scream();1337 }1338 }1339}1340 1341// Comma after Condition1342 1343void negative_comma_after_condition() {1344 bool onFire = isBurning();1345 if (doSomething(), onFire) {1346 tryToExtinguish(onFire);1347 if (doSomething(), onFire) {1348 // NO-MESSAGE: fire may have been extinguished1349 scream();1350 }1351 }1352}1353 1354//===--- Unhandled Cases --------------------------------------------------===//1355 1356void negated_in_else() {1357 bool onFire = isBurning();1358 if (onFire) {1359 scream();1360 } else {1361 if (!onFire) {1362 doSomething();1363 }1364 }1365}1366 1367void equality() {1368 if (peopleInTheBuilding == 1) {1369 if (peopleInTheBuilding == 1) {1370 doSomething();1371 }1372 }1373}1374 1375void relational_operator() {1376 if (peopleInTheBuilding > 2) {1377 if (peopleInTheBuilding > 1) {1378 doSomething();1379 }1380 }1381}1382 1383void relational_operator_reversed() {1384 if (peopleInTheBuilding > 1) {1385 if (1 < peopleInTheBuilding) {1386 doSomething();1387 }1388 }1389}1390 1391void volatile_concrete_address() {1392 // No warning. The value behind the volatile concrete address1393 // is beyond our control. It may change at any time.1394 if (*(volatile int *)0x1234) {1395 if (*(volatile int *)0x1234) {1396 doSomething();1397 }1398 }1399}1400