[clang-tidy] false-positive for bugprone-redundant-branch-condition in case of passed...
[lldb.git] / clang-tools-extra / test / clang-tidy / checkers / bugprone-redundant-branch-condition.cpp
1 // RUN: %check_clang_tidy %s bugprone-redundant-branch-condition %t
2
3 extern unsigned peopleInTheBuilding;
4 extern unsigned fireFighters;
5
6 bool isBurning();
7 bool isReallyBurning();
8 bool isCollapsing();
9 bool tryToExtinguish(bool&);
10 bool tryToExtinguishByVal(bool);
11 void tryPutFireOut();
12 bool callTheFD();
13 void scream();
14
15 bool someOtherCondition();
16
17 //===--- Basic Positives --------------------------------------------------===//
18
19 void positive_direct() {
20   bool onFire = isBurning();
21   if (onFire) {
22     if (onFire) {
23       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
24       // CHECK-FIXES: {{^\ *$}}
25       scream();
26     }
27     // CHECK-FIXES: {{^\ *$}}
28   }
29 }
30
31 void positive_indirect() {
32   bool onFire = isBurning();
33   if (onFire) {
34     if (someOtherCondition()) {
35       if (onFire)
36         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
37         // CHECK-FIXES: {{^\ *$}}
38         scream();
39     }
40   }
41 }
42
43 void positive_direct_inner_and_lhs() {
44   bool onFire = isBurning();
45   if (onFire) {
46     if (onFire && peopleInTheBuilding > 0) {
47       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
48       // CHECK-FIXES: if ( peopleInTheBuilding > 0) {
49       scream();
50     }
51   }
52 }
53
54 void positive_indirect_inner_and_lhs() {
55   bool onFire = isBurning();
56   if (onFire) {
57     if (someOtherCondition()) {
58       if (onFire && peopleInTheBuilding > 0) {
59         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
60         // CHECK-FIXES: if ( peopleInTheBuilding > 0) {
61         scream();
62       }
63     }
64   }
65 }
66
67 void positive_direct_inner_and_rhs() {
68   bool onFire = isBurning();
69   if (onFire) {
70     if (peopleInTheBuilding > 0 && onFire) {
71       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
72       // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {
73       scream();
74     }
75   }
76 }
77
78 void positive_indirect_inner_and_rhs() {
79   bool onFire = isBurning();
80   if (onFire) {
81     if (someOtherCondition()) {
82       if (peopleInTheBuilding > 0 && onFire) {
83         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
84         // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {
85         scream();
86       }
87     }
88   }
89 }
90
91 void positive_direct_inner_or_lhs() {
92   bool onFire = isBurning();
93   if (onFire) {
94     if (onFire || isCollapsing()) {
95       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
96       // CHECK-FIXES: {{^\ *$}}
97       scream();
98     }
99     // CHECK-FIXES: {{^\ *$}}
100   }
101 }
102
103 void positive_indirect_inner_or_lhs() {
104   bool onFire = isBurning();
105   if (onFire) {
106     if (someOtherCondition()) {
107       if (onFire || isCollapsing()) {
108         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
109         // CHECK-FIXES: {{^\ *$}}
110         scream();
111       }
112       // CHECK-FIXES: {{^\ *$}}
113     }
114   }
115 }
116
117 void positive_direct_inner_or_rhs() {
118   bool onFire = isBurning();
119   if (onFire) {
120     if (isCollapsing() || onFire) {
121       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
122       // CHECK-FIXES: {{^\ *$}}
123       scream();
124     }
125     // CHECK-FIXES: {{^\ *$}}
126   }
127 }
128
129 void positive_indirect_inner_or_rhs() {
130   bool onFire = isBurning();
131   if (onFire) {
132     if (someOtherCondition()) {
133       if (isCollapsing() || onFire) {
134         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
135         // CHECK-FIXES: {{^\ *$}}
136         scream();
137       }
138       // CHECK-FIXES: {{^\ *$}}
139     }
140   }
141 }
142
143 void positive_direct_outer_and_lhs() {
144   bool onFire = isBurning();
145   if (onFire && fireFighters < 10) {
146     if (onFire) {
147       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
148     // CHECK-FIXES: {{^\ *$}}
149       scream();
150     }
151     // CHECK-FIXES: {{^\ *$}}
152   }
153 }
154
155 void positive_indirect_outer_and_lhs() {
156   bool onFire = isBurning();
157   if (onFire && fireFighters < 10) {
158     if (someOtherCondition()) {
159       if (onFire) {
160         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
161         // CHECK-FIXES: {{^\ *$}}
162         scream();
163       }
164       // CHECK-FIXES: {{^\ *$}}
165     }
166   }
167 }
168
169 void positive_direct_outer_and_lhs_inner_and_lhs() {
170   bool onFire = isBurning();
171   if (onFire && fireFighters < 10) {
172     if (onFire && peopleInTheBuilding > 0) {
173       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
174       // CHECK-FIXES: if ( peopleInTheBuilding > 0) {
175       scream();
176     }
177   }
178 }
179
180 void positive_indirect_outer_and_lhs_inner_and_lhs() {
181   bool onFire = isBurning();
182   if (onFire && fireFighters < 10) {
183     if (someOtherCondition()) {
184       if (onFire && peopleInTheBuilding > 0) {
185         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
186         // CHECK-FIXES: if ( peopleInTheBuilding > 0) {
187         scream();
188       }
189     }
190   }
191 }
192
193 void positive_direct_outer_and_lhs_inner_and_rhs() {
194   bool onFire = isBurning();
195   if (onFire && fireFighters < 10) {
196     if (peopleInTheBuilding > 0 && onFire) {
197       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
198       // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {
199       scream();
200     }
201   }
202 }
203
204 void positive_indirect_outer_and_lhs_inner_and_rhs() {
205   bool onFire = isBurning();
206   if (onFire && fireFighters < 10) {
207     if (someOtherCondition()) {
208       if (peopleInTheBuilding > 0 && onFire) {
209         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
210         // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {
211         scream();
212       }
213     }
214   }
215 }
216
217 void positive_direct_outer_and_lhs_inner_or_lhs() {
218   bool onFire = isBurning();
219   if (onFire && fireFighters < 10) {
220     if (onFire || isCollapsing()) {
221       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
222       // CHECK-FIXES: {{^\ *$}}
223       scream();
224     }
225     // CHECK-FIXES: {{^\ *$}}
226   }
227 }
228
229 void positive_indirect_outer_and_lhs_inner_or_lhs() {
230   bool onFire = isBurning();
231   if (onFire && fireFighters < 10) {
232     if (someOtherCondition()) {
233       if (onFire || isCollapsing()) {
234         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
235         // CHECK-FIXES: {{^\ *$}}
236         scream();
237       }
238     // CHECK-FIXES: {{^\ *$}}
239     }
240   }
241 }
242
243 void positive_direct_outer_and_lhs_inner_or_rhs() {
244   bool onFire = isBurning();
245   if (onFire && fireFighters < 10) {
246     if (isCollapsing() || onFire) {
247       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
248       // CHECK-FIXES: {{^\ *$}}
249       scream();
250     }
251     // CHECK-FIXES: {{^\ *$}}
252   }
253 }
254
255 void positive_indirect_outer_and_lhs_inner_or_rhs() {
256   bool onFire = isBurning();
257   if (onFire && fireFighters < 10) {
258     if (someOtherCondition()) {
259       if (isCollapsing() || onFire) {
260         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
261         // CHECK-FIXES: {{^\ *$}}
262         scream();
263       }
264       // CHECK-FIXES: {{^\ *$}}
265     }
266   }
267 }
268
269 void positive_direct_outer_and_rhs() {
270   bool onFire = isBurning();
271   if (fireFighters < 10 && onFire) {
272     if (onFire) {
273       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
274       // CHECK-FIXES: {{^\ *$}}
275       scream();
276     }
277     // CHECK-FIXES: {{^\ *$}}
278   }
279 }
280
281 void positive_indirect_outer_and_rhs() {
282   bool onFire = isBurning();
283   if (fireFighters < 10 && onFire) {
284     if (someOtherCondition()) {
285       if (onFire) {
286         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
287         // CHECK-FIXES: {{^\ *$}}
288         scream();
289       }
290       // CHECK-FIXES: {{^\ *$}}
291     }
292   }
293 }
294
295 void positive_direct_outer_and_rhs_inner_and_lhs() {
296   bool onFire = isBurning();
297   if (fireFighters < 10 && onFire) {
298     if (onFire && peopleInTheBuilding > 0) {
299       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
300       // CHECK-FIXES: if ( peopleInTheBuilding > 0) {
301       scream();
302     }
303   }
304 }
305
306 void positive_indirect_outer_and_rhs_inner_and_lhs() {
307   bool onFire = isBurning();
308   if (fireFighters < 10 && onFire) {
309     if (someOtherCondition()) {
310       if (onFire && peopleInTheBuilding > 0) {
311         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
312         // CHECK-FIXES: if ( peopleInTheBuilding > 0) {
313         scream();
314       }
315     }
316   }
317 }
318
319 void positive_direct_inner_outer_and_rhs_and_rhs() {
320   bool onFire = isBurning();
321   if (fireFighters < 10 && onFire) {
322     if (peopleInTheBuilding > 0 && onFire) {
323       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
324         // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {
325       scream();
326     }
327   }
328 }
329
330 void positive_indirect_outer_and_rhs_inner_and_rhs() {
331   bool onFire = isBurning();
332   if (fireFighters < 10 && onFire) {
333     if (someOtherCondition()) {
334       if (peopleInTheBuilding > 0 && onFire) {
335         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
336         // CHECK-FIXES: if (peopleInTheBuilding > 0 ) {
337         scream();
338       }
339     }
340   }
341 }
342
343 void positive_direct_outer_and_rhs_inner_or_lhs() {
344   bool onFire = isBurning();
345   if (fireFighters < 10 && onFire) {
346     if (onFire || isCollapsing()) {
347       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
348       // CHECK-FIXES: {{^\ *$}}
349       scream();
350     }
351     // CHECK-FIXES: {{^\ *$}}
352   }
353 }
354
355 void positive_indirect_outer_and_rhs_inner_or_lhs() {
356   bool onFire = isBurning();
357   if (fireFighters < 10 && onFire) {
358     if (someOtherCondition()) {
359       if (onFire || isCollapsing()) {
360         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
361         // CHECK-FIXES: {{^\ *$}}
362         scream();
363       }
364       // CHECK-FIXES: {{^\ *$}}
365     }
366   }
367 }
368
369 void positive_direct_outer_and_rhs_inner_or_rhs() {
370   bool onFire = isBurning();
371   if (fireFighters < 10 && onFire) {
372     if (isCollapsing() || onFire) {
373       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
374       // CHECK-FIXES: {{^\ *$}}
375       scream();
376     }
377     // CHECK-FIXES: {{^\ *$}}
378   }
379 }
380
381 void positive_indirect_outer_and_rhs_inner_or_rhs() {
382   bool onFire = isBurning();
383   if (fireFighters < 10 && onFire) {
384     if (someOtherCondition()) {
385       if (isCollapsing() || onFire) {
386         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
387         // CHECK-FIXES: {{^\ *$}}
388         scream();
389       }
390       // CHECK-FIXES: {{^\ *$}}
391     }
392   }
393 }
394
395 //===--- Basic Negatives --------------------------------------------------===//
396
397 void negative_direct() {
398   bool onFire = isBurning();
399   if (onFire) {
400     tryToExtinguish(onFire);
401     if (onFire) {
402       // NO-MESSAGE: fire may have been extinguished
403       scream();
404     }
405   }
406 }
407
408 void negative_indirect() {
409   bool onFire = isBurning();
410   if (onFire) {
411     tryToExtinguish(onFire);
412     if (someOtherCondition()) {
413       if (onFire) {
414         // NO-MESSAGE: fire may have been extinguished
415         scream();
416       }
417     }
418   }
419 }
420
421 void negative_indirect2() {
422   bool onFire = isBurning();
423   if (onFire) {
424     if (someOtherCondition()) {
425       tryToExtinguish(onFire);
426       if (onFire) {
427         // NO-MESSAGE: fire may have been extinguished
428         scream();
429       }
430     }
431   }
432 }
433
434 void negative_direct_inner_and_lhs() {
435   bool onFire = isBurning();
436   if (onFire) {
437     tryToExtinguish(onFire);
438     if (onFire && peopleInTheBuilding > 0) {
439       // NO-MESSAGE: fire may have been extinguished
440       scream();
441     }
442   }
443 }
444
445 void negative_indirect_inner_and_lhs() {
446   bool onFire = isBurning();
447   if (onFire) {
448     tryToExtinguish(onFire);
449     if (someOtherCondition()) {
450       if (onFire && peopleInTheBuilding > 0) {
451         // NO-MESSAGE: fire may have been extinguished
452         scream();
453       }
454     }
455   }
456 }
457
458 void negative_indirect2_inner_and_lhs() {
459   bool onFire = isBurning();
460   if (onFire) {
461     if (someOtherCondition()) {
462       tryToExtinguish(onFire);
463       if (onFire && peopleInTheBuilding > 0) {
464         // NO-MESSAGE: fire may have been extinguished
465         scream();
466       }
467     }
468   }
469 }
470
471 void negative_direct_inner_and_rhs() {
472   bool onFire = isBurning();
473   if (onFire) {
474     tryToExtinguish(onFire);
475     if (peopleInTheBuilding > 0 && onFire) {
476       // NO-MESSAGE: fire may have been extinguished
477       scream();
478     }
479   }
480 }
481
482 void negative_indirect_inner_and_rhs() {
483   bool onFire = isBurning();
484   if (onFire) {
485     tryToExtinguish(onFire);
486     if (someOtherCondition()) {
487       if (peopleInTheBuilding > 0 && onFire) {
488         // NO-MESSAGE: fire may have been extinguished
489         scream();
490       }
491     }
492   }
493 }
494
495 void negative_indirect2_inner_and_rhs() {
496   bool onFire = isBurning();
497   if (onFire) {
498     if (someOtherCondition()) {
499       tryToExtinguish(onFire);
500       if (peopleInTheBuilding > 0 && onFire) {
501         // NO-MESSAGE: fire may have been extinguished
502         scream();
503       }
504     }
505   }
506 }
507
508 void negative_direct_inner_or_lhs() {
509   bool onFire = isBurning();
510   if (onFire) {
511     tryToExtinguish(onFire);
512     if (onFire || isCollapsing()) {
513       // NO-MESSAGE: fire may have been extinguished
514       scream();
515     }
516   }
517 }
518
519 void negative_indirect_inner_or_lhs() {
520   bool onFire = isBurning();
521   if (onFire) {
522     tryToExtinguish(onFire);
523     if (someOtherCondition()) {
524       if (onFire || isCollapsing()) {
525         // NO-MESSAGE: fire may have been extinguished
526         scream();
527       }
528     }
529   }
530 }
531
532 void negative_indirect2_inner_or_lhs() {
533   bool onFire = isBurning();
534   if (onFire) {
535     if (someOtherCondition()) {
536       tryToExtinguish(onFire);
537       if (onFire || isCollapsing()) {
538         // NO-MESSAGE: fire may have been extinguished
539         scream();
540       }
541     }
542   }
543 }
544
545 void negative_direct_inner_or_rhs() {
546   bool onFire = isBurning();
547   if (onFire) {
548     tryToExtinguish(onFire);
549     if (isCollapsing() || onFire) {
550       // NO-MESSAGE: fire may have been extinguished
551       scream();
552     }
553   }
554 }
555
556 void negative_indirect_inner_or_rhs() {
557   bool onFire = isBurning();
558   if (onFire) {
559     tryToExtinguish(onFire);
560     if (someOtherCondition()) {
561       if (isCollapsing() || onFire) {
562         // NO-MESSAGE: fire may have been extinguished
563         scream();
564       }
565     }
566   }
567 }
568
569 void negative_indirect2_inner_or_rhs() {
570   bool onFire = isBurning();
571   if (onFire) {
572     if (someOtherCondition()) {
573       tryToExtinguish(onFire);
574       if (isCollapsing() || onFire) {
575         // NO-MESSAGE: fire may have been extinguished
576         scream();
577       }
578     }
579   }
580 }
581
582 void negative_direct_outer_and_lhs() {
583   bool onFire = isBurning();
584   if (onFire && fireFighters < 10) {
585     tryToExtinguish(onFire);
586     if (onFire) {
587       // NO-MESSAGE: fire may have been extinguished
588       scream();
589     }
590   }
591 }
592
593 void negative_indirect_outer_and_lhs() {
594   bool onFire = isBurning();
595   if (onFire && fireFighters < 10) {
596     tryToExtinguish(onFire);
597     if (someOtherCondition()) {
598       if (onFire) {
599         // NO-MESSAGE: fire may have been extinguished
600         scream();
601       }
602     }
603   }
604 }
605
606 void negative_indirect2_outer_and_lhs() {
607   bool onFire = isBurning();
608   if (onFire && fireFighters < 10) {
609     if (someOtherCondition()) {
610       tryToExtinguish(onFire);
611       if (onFire) {
612         // NO-MESSAGE: fire may have been extinguished
613         scream();
614       }
615     }
616   }
617 }
618
619 void negative_direct_outer_and_lhs_inner_and_lhs() {
620   bool onFire = isBurning();
621   if (onFire && fireFighters < 10) {
622     tryToExtinguish(onFire);
623     if (onFire && peopleInTheBuilding > 0) {
624       // NO-MESSAGE: fire may have been extinguished
625       scream();
626     }
627   }
628 }
629
630 void negative_indirect_outer_and_lhs_inner_and_lhs() {
631   bool onFire = isBurning();
632   if (onFire && fireFighters < 10) {
633     tryToExtinguish(onFire);
634     if (someOtherCondition()) {
635       if (onFire && peopleInTheBuilding > 0) {
636         // NO-MESSAGE: fire may have been extinguished
637         scream();
638       }
639     }
640   }
641 }
642
643 void negative_indirect2_outer_and_lhs_inner_and_lhs() {
644   bool onFire = isBurning();
645   if (onFire && fireFighters < 10) {
646     if (someOtherCondition()) {
647       tryToExtinguish(onFire);
648       if (onFire && peopleInTheBuilding > 0) {
649         // NO-MESSAGE: fire may have been extinguished
650         scream();
651       }
652     }
653   }
654 }
655
656 void negative_direct_outer_and_lhs_inner_and_rhs() {
657   bool onFire = isBurning();
658   if (onFire && fireFighters < 10) {
659     tryToExtinguish(onFire);
660     if (peopleInTheBuilding > 0 && onFire) {
661       // NO-MESSAGE: fire may have been extinguished
662       scream();
663     }
664   }
665 }
666
667 void negative_indirect_outer_and_lhs_inner_and_rhs() {
668   bool onFire = isBurning();
669   if (onFire && fireFighters < 10) {
670     tryToExtinguish(onFire);
671     if (someOtherCondition()) {
672       if (peopleInTheBuilding > 0 && onFire) {
673         // NO-MESSAGE: fire may have been extinguished
674         scream();
675       }
676     }
677   }
678 }
679
680 void negative_indirect2_outer_and_lhs_inner_and_rhs() {
681   bool onFire = isBurning();
682   if (onFire && fireFighters < 10) {
683     if (someOtherCondition()) {
684       tryToExtinguish(onFire);
685       if (peopleInTheBuilding > 0 && onFire) {
686         // NO-MESSAGE: fire may have been extinguished
687         scream();
688       }
689     }
690   }
691 }
692
693 void negative_direct_outer_and_lhs_inner_or_lhs() {
694   bool onFire = isBurning();
695   if (onFire && fireFighters < 10) {
696     tryToExtinguish(onFire);
697     if (onFire || isCollapsing()) {
698       // NO-MESSAGE: fire may have been extinguished
699       scream();
700     }
701   }
702 }
703
704 void negative_indirect_outer_and_lhs_inner_or_lhs() {
705   bool onFire = isBurning();
706   if (onFire && fireFighters < 10) {
707     tryToExtinguish(onFire);
708     if (someOtherCondition()) {
709       if (onFire || isCollapsing()) {
710         // NO-MESSAGE: fire may have been extinguished
711         scream();
712       }
713     }
714   }
715 }
716
717 void negative_indirect2_outer_and_lhs_inner_or_lhs() {
718   bool onFire = isBurning();
719   if (onFire && fireFighters < 10) {
720     if (someOtherCondition()) {
721       tryToExtinguish(onFire);
722       if (onFire || isCollapsing()) {
723         // NO-MESSAGE: fire may have been extinguished
724         scream();
725       }
726     }
727   }
728 }
729
730 void negative_direct_outer_and_lhs_inner_or_rhs() {
731   bool onFire = isBurning();
732   if (onFire && fireFighters < 10) {
733     tryToExtinguish(onFire);
734     if (isCollapsing() || onFire) {
735       // NO-MESSAGE: fire may have been extinguished
736       scream();
737     }
738   }
739 }
740
741 void negative_indirect_outer_and_lhs_inner_or_rhs() {
742   bool onFire = isBurning();
743   if (onFire && fireFighters < 10) {
744     tryToExtinguish(onFire);
745     if (someOtherCondition()) {
746       if (isCollapsing() || onFire) {
747         // NO-MESSAGE: fire may have been extinguished
748         scream();
749       }
750     }
751   }
752 }
753
754 void negative_indirect2_outer_and_lhs_inner_or_rhs() {
755   bool onFire = isBurning();
756   if (onFire && fireFighters < 10) {
757     if (someOtherCondition()) {
758       tryToExtinguish(onFire);
759       if (isCollapsing() || onFire) {
760         // NO-MESSAGE: fire may have been extinguished
761         scream();
762       }
763     }
764   }
765 }
766
767 void negative_direct_outer_and_rhs() {
768   bool onFire = isBurning();
769   if (fireFighters < 10 && onFire) {
770     tryToExtinguish(onFire);
771     if (onFire) {
772       // NO-MESSAGE: fire may have been extinguished
773       scream();
774     }
775   }
776 }
777
778 void negative_indirect_outer_and_rhs() {
779   bool onFire = isBurning();
780   if (fireFighters < 10 && onFire) {
781     tryToExtinguish(onFire);
782     if (someOtherCondition()) {
783       if (onFire) {
784         // NO-MESSAGE: fire may have been extinguished
785         scream();
786       }
787     }
788   }
789 }
790
791 void negative_indirect2_outer_and_rhs() {
792   bool onFire = isBurning();
793   if (fireFighters < 10 && onFire) {
794     if (someOtherCondition()) {
795       tryToExtinguish(onFire);
796       if (onFire) {
797         // NO-MESSAGE: fire may have been extinguished
798         scream();
799       }
800     }
801   }
802 }
803
804 void negative_direct_outer_and_rhs_inner_and_lhs() {
805   bool onFire = isBurning();
806   if (fireFighters < 10 && onFire) {
807     tryToExtinguish(onFire);
808     if (onFire && peopleInTheBuilding > 0) {
809       // NO-MESSAGE: fire may have been extinguished
810       scream();
811     }
812   }
813 }
814
815 void negative_indirect_outer_and_rhs_inner_and_lhs() {
816   bool onFire = isBurning();
817   if (fireFighters < 10 && onFire) {
818     tryToExtinguish(onFire);
819     if (someOtherCondition()) {
820       if (onFire && peopleInTheBuilding > 0) {
821         // NO-MESSAGE: fire may have been extinguished
822         scream();
823       }
824     }
825   }
826 }
827
828 void negative_indirect2_outer_and_rhs_inner_and_lhs() {
829   bool onFire = isBurning();
830   if (fireFighters < 10 && onFire) {
831     if (someOtherCondition()) {
832       tryToExtinguish(onFire);
833       if (onFire && peopleInTheBuilding > 0) {
834         // NO-MESSAGE: fire may have been extinguished
835         scream();
836       }
837     }
838   }
839 }
840
841 void negative_direct_inner_outer_and_rhs_and_rhs() {
842   bool onFire = isBurning();
843   if (fireFighters < 10 && onFire) {
844     tryToExtinguish(onFire);
845     if (peopleInTheBuilding > 0 && onFire) {
846       // NO-MESSAGE: fire may have been extinguished
847       scream();
848     }
849   }
850 }
851
852 void negative_indirect_outer_and_rhs_inner_and_rhs() {
853   bool onFire = isBurning();
854   if (fireFighters < 10 && onFire) {
855     tryToExtinguish(onFire);
856     if (someOtherCondition()) {
857       if (peopleInTheBuilding > 0 && onFire) {
858         // NO-MESSAGE: fire may have been extinguished
859         scream();
860       }
861     }
862   }
863 }
864
865 void negative_indirect2_outer_and_rhs_inner_and_rhs() {
866   bool onFire = isBurning();
867   if (fireFighters < 10 && onFire) {
868     if (someOtherCondition()) {
869       tryToExtinguish(onFire);
870       if (peopleInTheBuilding > 0 && onFire) {
871         // NO-MESSAGE: fire may have been extinguished
872         scream();
873       }
874     }
875   }
876 }
877
878 void negative_direct_outer_and_rhs_inner_or_lhs() {
879   bool onFire = isBurning();
880   if (fireFighters < 10 && onFire) {
881     tryToExtinguish(onFire);
882     if (onFire || isCollapsing()) {
883       // NO-MESSAGE: fire may have been extinguished
884       scream();
885     }
886   }
887 }
888
889 void negative_indirect_outer_and_rhs_inner_or_lhs() {
890   bool onFire = isBurning();
891   if (fireFighters < 10 && onFire) {
892     tryToExtinguish(onFire);
893     if (someOtherCondition()) {
894       if (onFire || isCollapsing()) {
895         // NO-MESSAGE: fire may have been extinguished
896         scream();
897       }
898     }
899   }
900 }
901
902 void negative_indirect2_outer_and_rhs_inner_or_lhs() {
903   bool onFire = isBurning();
904   if (fireFighters < 10 && onFire) {
905     if (someOtherCondition()) {
906       tryToExtinguish(onFire);
907       if (onFire || isCollapsing()) {
908         // NO-MESSAGE: fire may have been extinguished
909         scream();
910       }
911     }
912   }
913 }
914
915 void negative_direct_outer_and_rhs_inner_or_rhs() {
916   bool onFire = isBurning();
917   if (fireFighters < 10 && onFire) {
918     tryToExtinguish(onFire);
919     if (isCollapsing() || onFire) {
920       // NO-MESSAGE: fire may have been extinguished
921       scream();
922     }
923   }
924 }
925
926 void negative_indirect_outer_and_rhs_inner_or_rhs() {
927   bool onFire = isBurning();
928   if (fireFighters < 10 && onFire) {
929     tryToExtinguish(onFire);
930     if (someOtherCondition()) {
931       if (isCollapsing() || onFire) {
932         // NO-MESSAGE: fire may have been extinguished
933         scream();
934       }
935     }
936   }
937 }
938
939 void negative_indirect2_outer_and_rhs_inner_or_rhs() {
940   bool onFire = isBurning();
941   if (fireFighters < 10 && onFire) {
942     if (someOtherCondition()) {
943       tryToExtinguish(onFire);
944       if (isCollapsing() || onFire) {
945         // NO-MESSAGE: fire may have been extinguished
946         scream();
947       }
948     }
949   }
950 }
951
952 void negative_by_ref(bool onFire) {
953   if (tryToExtinguish(onFire) && onFire) {
954     if (tryToExtinguish(onFire) && onFire) {
955       // NO-MESSAGE: fire may have been extinguished
956       scream();
957     }
958   }
959 }
960
961 void negative_by_val(bool onFire) {
962   if (tryToExtinguishByVal(onFire) && onFire) {
963     if (tryToExtinguish(onFire) && onFire) {
964       // NO-MESSAGE: fire may have been extinguished
965       scream();
966     }
967   }
968   if (tryToExtinguish(onFire) && onFire) {
969     if (tryToExtinguishByVal(onFire) && onFire) {
970       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
971       scream();
972     }
973   }
974 }
975
976 void negative_reassigned() {
977   bool onFire = isBurning();
978   if (onFire) {
979     onFire = isReallyBurning();
980     if (onFire) {
981       // NO-MESSAGE: it was a false alarm then
982       scream();
983     }
984   }
985 }
986
987 //===--- Special Positives ------------------------------------------------===//
988
989 // Condition variable mutated in or after the inner loop
990
991 void positive_direct_mutated_after_inner() {
992   bool onFire = isBurning();
993   if (onFire) {
994     if (onFire) {
995       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
996       // CHECK-FIXES: {{^\ *$}}
997       scream();
998     }
999     // CHECK-FIXES: {{^\ *$}}
1000     tryToExtinguish(onFire);
1001   }
1002 }
1003
1004 void positive_indirect_mutated_after_inner() {
1005   bool onFire = isBurning();
1006   if (onFire) {
1007     if (someOtherCondition()) {
1008       if (onFire) {
1009         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1010         // CHECK-FIXES: {{^\ *$}}
1011         scream();
1012       }
1013       // CHECK-FIXES: {{^\ *$}}
1014     }
1015     tryToExtinguish(onFire);
1016   }
1017 }
1018
1019 void positive_indirect2_mutated_after_inner() {
1020   bool onFire = isBurning();
1021   if (onFire) {
1022     if (someOtherCondition()) {
1023       if (onFire) {
1024         // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1025         // CHECK-FIXES: {{^\ *$}}
1026         scream();
1027       }
1028       // CHECK-FIXES: {{^\ *$}}
1029       tryToExtinguish(onFire);
1030     }
1031   }
1032 }
1033
1034 void positive_mutated_in_inner() {
1035   bool onFire = isBurning();
1036   if (onFire) {
1037     if (onFire) {
1038       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1039       // CHECK-FIXES: {{^\ *$}}
1040       tryToExtinguish(onFire);
1041       scream();
1042     }
1043     // CHECK-FIXES: {{^\ *$}}
1044   }
1045 }
1046
1047 void positive_or_lhs_with_side_effect() {
1048   bool onFire = isBurning();
1049   if (onFire) {
1050     if (callTheFD() || onFire) {
1051       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1052       // CHECK-FIXES: callTheFD() ;
1053       scream();
1054     }
1055     // CHECK-FIXES: {{^\ *$}}
1056   }
1057 }
1058
1059 void positive_or_rhs_with_side_effect() {
1060   bool onFire = isBurning();
1061   if (onFire) {
1062     if (onFire || callTheFD()) {
1063       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1064       // CHECK-FIXES: callTheFD();
1065       scream();
1066     }
1067     // CHECK-FIXES: {{^\ *$}}
1068   }
1069 }
1070
1071 // GNU Expression Statements
1072
1073 void doSomething();
1074
1075 void positive_gnu_expression_statement() {
1076   bool onFire = isBurning();
1077   if (({ doSomething(); onFire; })) {
1078     if (({ doSomething(); onFire; })) {
1079       // FIXME: Handle GNU epxression statements
1080       // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1081       // CHCK-FIXES-NOT: doSomething();
1082       scream();
1083     }
1084   }
1085 }
1086
1087 // Comma after Condition
1088
1089 void positive_comma_after_condition() {
1090   bool onFire = isBurning();
1091   if (doSomething(), onFire) {
1092     if (doSomething(), onFire) {
1093       // FIXME: Handle comma operator
1094       // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: redundant condition 'onFire' [bugprone-redundant-branch-condition]
1095       // CHCK-FIXES-NOT: doSomething();
1096       scream();
1097     }
1098   }
1099 }
1100
1101 // ExprWithCleanups doesn't crash
1102 int positive_expr_with_cleanups() {
1103   class RetT {
1104   public:
1105     RetT(const int code);
1106     bool Ok() const;
1107     static RetT Test(bool isSet);
1108
1109   private:
1110     int code_;
1111   };
1112
1113   bool isSet = false;
1114   if (RetT::Test(isSet).Ok() && isSet) {
1115     if (RetT::Test(isSet).Ok() && isSet) {
1116       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'isSet' [bugprone-redundant-branch-condition]
1117       // CHECK-FIXES: if (RetT::Test(isSet).Ok() ) {
1118     }
1119   }
1120   if (isSet) {
1121     if ((RetT::Test(isSet).Ok() && isSet)) {
1122       // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: redundant condition 'isSet' [bugprone-redundant-branch-condition]
1123       // CHECK-FIXES: if ((RetT::Test(isSet).Ok() )) {
1124     }
1125   }
1126   return 0;
1127 }
1128
1129 //===--- Special Negatives ------------------------------------------------===//
1130
1131 // Aliasing
1132
1133 void negative_mutated_by_ptr() {
1134   bool onFire = isBurning();
1135   bool *firePtr = &onFire;
1136   if (onFire) {
1137     tryToExtinguish(*firePtr);
1138     if (onFire) {
1139       // NO-MESSAGE: fire may have been extinguished
1140       scream();
1141     }
1142   }
1143 }
1144
1145 void negative_mutated_by_ref() {
1146   bool onFire = isBurning();
1147   bool &fireRef = onFire;
1148   if (onFire) {
1149     tryToExtinguish(fireRef);
1150     if (onFire) {
1151       // NO-MESSAGE: fire may have been extinguished
1152       scream();
1153     }
1154   }
1155 }
1156
1157 // Volatile
1158
1159 void negatvie_volatile() {
1160   bool volatile onFire = isBurning();
1161   if (onFire) {
1162     if (onFire) {
1163       // NO-MESSAGE: maybe some other thread extinguished the fire
1164       scream();
1165     }
1166   }
1167 }
1168
1169 void negative_else_branch(bool isHot) {
1170   bool onFire = isBurning();
1171   if (onFire) {
1172     tryPutFireOut();
1173   } else {
1174     if (isHot && onFire) {
1175       // NO-MESSAGE: new check is in the `else` branch
1176       // FIXME: handle `else` branches and negated conditions
1177       scream();
1178     }
1179   }
1180 }
1181
1182 // GNU Expression Statements
1183
1184 void negative_gnu_expression_statement() {
1185   bool onFire = isBurning();
1186   if (({ doSomething(); onFire; })) {
1187     tryToExtinguish(onFire);
1188     if (({ doSomething(); onFire; })) {
1189       // NO-MESSAGE: fire may have been extinguished
1190       scream();
1191     }
1192   }
1193 }
1194
1195 // Comma after Condition
1196
1197 void negative_comma_after_condition() {
1198   bool onFire = isBurning();
1199   if (doSomething(), onFire) {
1200     tryToExtinguish(onFire);
1201     if (doSomething(), onFire) {
1202       // NO-MESSAGE: fire may have been extinguished
1203       scream();
1204     }
1205   }
1206 }
1207
1208 //===--- Unhandled Cases --------------------------------------------------===//
1209
1210 void negated_in_else() {
1211   bool onFire = isBurning();
1212   if (onFire) {
1213     scream();
1214   } else {
1215     if (!onFire) {
1216       doSomething();
1217     }
1218   }
1219 }
1220
1221 void equality() {
1222   if (peopleInTheBuilding == 1) {
1223     if (peopleInTheBuilding == 1) {
1224       doSomething();
1225     }
1226   }
1227 }
1228
1229 void relational_operator() {
1230   if (peopleInTheBuilding > 2) {
1231     if (peopleInTheBuilding > 1) {
1232       doSomething();
1233     }
1234   }
1235 }
1236
1237 void relational_operator_reversed() {
1238   if (peopleInTheBuilding > 1) {
1239     if (1 < peopleInTheBuilding) {
1240       doSomething();
1241     }
1242   }
1243 }