1// RUN: %check_clang_tidy %s bugprone-branch-clone %t --
2
3/* Only one expected warning per function allowed at the very end. */
4
5int func(void)
6{
7 return 0;
8}
9
10int func2(void)
11{
12 return 0;
13}
14
15int funcParam(int a)
16{
17 return 0;
18}
19
20/* '!=' operator*/
21
22
23/* '!=' with int pointer */
24
25int checkNotEqualIntPointerLiteralCompare1(void) {
26 int* p = 0;
27 return (p != 0); // no warning
28}
29
30int checkNotEqualIntPointerLiteralCompare2(void) {
31 return (6 != 7); // no warning
32}
33
34int checkNotEqualIntPointerDeclCompare1(void) {
35 int k = 3;
36 int* f = &k;
37 int* g = &k;
38 return (f != g); // no warning
39}
40
41int checkNotEqualCastIntPointerDeclCompare11(void) {
42 int k = 7;
43 int* f = &k;
44 return ((int*)f != (int*)f);
45}
46int checkNotEqualCastIntPointerDeclCompare12(void) {
47 int k = 7;
48 int* f = &k;
49 return ((int*)((char*)f) != (int*)f); // no warning
50}
51int checkNotEqualBinaryOpIntPointerCompare1(void) {
52 int k = 7;
53 int res;
54 int* f= &k;
55 res = (f + 4 != f + 4);
56 return (0);
57}
58int checkNotEqualBinaryOpIntPointerCompare2(void) {
59 int k = 7;
60 int* f = &k;
61 int* g = &k;
62 return (f + 4 != g + 4); // no warning
63}
64
65
66int checkNotEqualBinaryOpIntPointerCompare3(void) {
67 int k = 7;
68 int res;
69 int* f= &k;
70 res = ((int*)f + 4 != (int*)f + 4);
71 return (0);
72}
73int checkNotEqualBinaryOpIntPointerCompare4(void) {
74 int k = 7;
75 int res;
76 int* f= &k;
77 res = ((int*)f + 4 != (int*)((char*)f) + 4); // no warning
78 return (0);
79}
80
81int checkNotEqualNestedBinaryOpIntPointerCompare1(void) {
82 int res;
83 int k = 7;
84 int t= 1;
85 int* u= &k+2;
86 int* f= &k+3;
87 res = ((f + (3)*t) != (f + (3)*t));
88 return (0);
89}
90
91int checkNotEqualNestedBinaryOpIntPointerCompare2(void) {
92 int res;
93 int k = 7;
94 int t= 1;
95 int* u= &k+2;
96 int* f= &k+3;
97 res = (((3)*t + f) != (f + (3)*t)); // no warning
98 return (0);
99}
100/* end '!=' int* */
101
102/* '!=' with function*/
103
104int checkNotEqualSameFunction() {
105 unsigned a = 0;
106 unsigned b = 1;
107 int res = (a+func() != a+func()); // no warning
108 return (0);
109}
110
111int checkNotEqualDifferentFunction() {
112 unsigned a = 0;
113 unsigned b = 1;
114 int res = (a+func() != a+func2()); // no warning
115 return (0);
116}
117
118int checkNotEqualSameFunctionSameParam() {
119 unsigned a = 0;
120 unsigned b = 1;
121 int res = (a+funcParam(a) != a+funcParam(a)); // no warning
122 return (0);
123}
124
125int checkNotEqualSameFunctionDifferentParam() {
126 unsigned a = 0;
127 unsigned b = 1;
128 int res = (a+funcParam(a) != a+funcParam(a: b)); // no warning
129 return (0);
130}
131
132/* end '!=' with function*/
133
134/* end '!=' */
135
136
137/* Checking use of identical expressions in conditional operator*/
138
139unsigned test_unsigned(unsigned a) {
140 unsigned b = 1;
141 a = a > 5 ? b : b;
142// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
143 return a;
144}
145
146void test_signed() {
147 int a = 0;
148 a = a > 5 ? a : a;
149// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
150}
151
152void test_bool(bool a) {
153 a = a > 0 ? a : a;
154// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
155}
156
157void test_float() {
158 float a = 0;
159 float b = 0;
160 a = a > 5 ? a : a;
161// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
162}
163
164const char *test_string() {
165 float a = 0;
166 return a > 5 ? "abc" : "abc";
167// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
168}
169
170void test_unsigned_expr() {
171 unsigned a = 0;
172 unsigned b = 0;
173 a = a > 5 ? a+b : a+b;
174// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
175}
176
177void test_signed_expr() {
178 int a = 0;
179 int b = 1;
180 a = a > 5 ? a+b : a+b;
181// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
182}
183
184void test_bool_expr(bool a) {
185 bool b = 0;
186 a = a > 0 ? a&&b : a&&b;
187// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
188}
189
190void test_unsigned_expr_negative() {
191 unsigned a = 0;
192 unsigned b = 0;
193 a = a > 5 ? a+b : b+a; // no warning
194}
195
196void test_signed_expr_negative() {
197 int a = 0;
198 int b = 1;
199 a = a > 5 ? b+a : a+b; // no warning
200}
201
202void test_bool_expr_negative(bool a) {
203 bool b = 0;
204 a = a > 0 ? a&&b : b&&a; // no warning
205}
206
207void test_float_expr_positive() {
208 float a = 0;
209 float b = 0;
210 a = a > 5 ? a+b : a+b;
211// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
212}
213
214void test_expr_positive_func() {
215 unsigned a = 0;
216 unsigned b = 1;
217 a = a > 5 ? a+func() : a+func();
218// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
219}
220
221void test_expr_negative_func() {
222 unsigned a = 0;
223 unsigned b = 1;
224 a = a > 5 ? a+func() : a+func2(); // no warning
225}
226
227void test_expr_positive_funcParam() {
228 unsigned a = 0;
229 unsigned b = 1;
230 a = a > 5 ? a+funcParam(a: b) : a+funcParam(a: b);
231// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
232}
233
234void test_expr_negative_funcParam() {
235 unsigned a = 0;
236 unsigned b = 1;
237 a = a > 5 ? a+funcParam(a) : a+funcParam(a: b); // no warning
238}
239
240void test_expr_positive_inc() {
241 unsigned a = 0;
242 unsigned b = 1;
243 a = a > 5 ? a++ : a++;
244// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
245}
246
247void test_expr_negative_inc() {
248 unsigned a = 0;
249 unsigned b = 1;
250 a = a > 5 ? a++ : b++; // no warning
251}
252
253void test_expr_positive_assign() {
254 unsigned a = 0;
255 unsigned b = 1;
256 a = a > 5 ? a=1 : a=1;
257// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
258}
259
260void test_expr_negative_assign() {
261 unsigned a = 0;
262 unsigned b = 1;
263 a = a > 5 ? a=1 : a=2; // no warning
264}
265
266void test_signed_nested_expr() {
267 int a = 0;
268 int b = 1;
269 int c = 3;
270 a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a));
271// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
272}
273
274void test_signed_nested_expr_negative() {
275 int a = 0;
276 int b = 1;
277 int c = 3;
278 a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(a+c)); // no warning
279}
280
281void test_signed_nested_cond_expr_negative() {
282 int a = 0;
283 int b = 1;
284 int c = 3;
285 a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 2 : 4); // no warning
286}
287
288void test_signed_nested_cond_expr() {
289 int a = 0;
290 int b = 1;
291 int c = 3;
292 a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4);
293// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
294}
295
296void test_identical_branches1(bool b) {
297 int i = 0;
298 if (b) {
299// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
300 ++i;
301 } else {
302// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
303 ++i;
304 }
305}
306
307void test_identical_branches2(bool b) {
308 int i = 0;
309 if (b) {
310// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
311 ++i;
312 } else
313// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
314 ++i;
315}
316
317void test_identical_branches3(bool b) {
318 int i = 0;
319 if (b) { // no warning
320 ++i;
321 } else {
322 i++;
323 }
324}
325
326void test_identical_branches4(bool b) {
327 int i = 0;
328 if (b) {
329// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
330 } else {
331// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
332 }
333}
334
335void test_identical_branches_break(bool b) {
336 while (true) {
337 if (b)
338// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone]
339 break;
340 else
341// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
342 break;
343 }
344}
345
346void test_identical_branches_continue(bool b) {
347 while (true) {
348 if (b)
349// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone]
350 continue;
351 else
352// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
353 continue;
354 }
355}
356
357void test_identical_branches_func(bool b) {
358 if (b)
359// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
360 func();
361 else
362// CHECK-MESSAGES: :[[@LINE-1]]:3: note: else branch starts here
363 func();
364}
365
366void test_identical_branches_func_arguments(bool b) {
367 if (b) // no-warning
368 funcParam(a: 1);
369 else
370 funcParam(a: 2);
371}
372
373void test_identical_branches_cast1(bool b) {
374 long v = -7;
375 if (b) // no-warning
376 v = (signed int) v;
377 else
378 v = (unsigned int) v;
379}
380
381void test_identical_branches_cast2(bool b) {
382 long v = -7;
383 if (b)
384// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
385 v = (signed int) v;
386 else
387// CHECK-MESSAGES: :[[@LINE-1]]:3: note: else branch starts here
388 v = (signed int) v;
389}
390
391int test_identical_branches_return_int(bool b) {
392 int i = 0;
393 if (b) {
394// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
395 i++;
396 return i;
397 } else {
398// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
399 i++;
400 return i;
401 }
402}
403
404int test_identical_branches_return_func(bool b) {
405 if (b) {
406// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
407 return func();
408 } else {
409// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
410 return func();
411 }
412}
413
414void test_identical_branches_for(bool b) {
415 int i;
416 int j;
417 if (b) {
418// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
419 for (i = 0, j = 0; i < 10; i++)
420 j += 4;
421 } else {
422// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
423 for (i = 0, j = 0; i < 10; i++)
424 j += 4;
425 }
426}
427
428void test_identical_branches_while(bool b) {
429 int i = 10;
430 if (b) {
431// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
432 while (func())
433 i--;
434 } else {
435// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
436 while (func())
437 i--;
438 }
439}
440
441void test_identical_branches_while_2(bool b) {
442 int i = 10;
443 if (b) { // no-warning
444 while (func())
445 i--;
446 } else {
447 while (func())
448 i++;
449 }
450}
451
452void test_identical_branches_do_while(bool b) {
453 int i = 10;
454 if (b) {
455// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
456 do {
457 i--;
458 } while (func());
459 } else {
460// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
461 do {
462 i--;
463 } while (func());
464 }
465}
466
467void test_identical_branches_if(bool b, int i) {
468 if (b) {
469// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone]
470 if (i < 5)
471 i += 10;
472 } else {
473// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
474 if (i < 5)
475 i += 10;
476 }
477}
478
479void test_identical_bitwise1() {
480 int a = 5 | 5; // no-warning
481}
482
483void test_identical_bitwise2() {
484 int a = 5;
485 int b = a | a; // no-warning
486}
487
488void test_identical_bitwise3() {
489 int a = 5;
490 int b = (a | a); // no-warning
491}
492
493void test_identical_bitwise4() {
494 int a = 4;
495 int b = a | 4; // no-warning
496}
497
498void test_identical_bitwise5() {
499 int a = 4;
500 int b = 4;
501 int c = a | b; // no-warning
502}
503
504void test_identical_bitwise6() {
505 int a = 5;
506 int b = a | 4 | a;
507}
508
509void test_identical_bitwise7() {
510 int a = 5;
511 int b = func() | func();
512}
513
514void test_identical_logical1(int a) {
515 if (a == 4 && a == 4)
516 ;
517}
518
519void test_identical_logical2(int a) {
520 if (a == 4 || a == 5 || a == 4)
521 ;
522}
523
524void test_identical_logical3(int a) {
525 if (a == 4 || a == 5 || a == 6) // no-warning
526 ;
527}
528
529void test_identical_logical4(int a) {
530 if (a == func() || a == func()) // no-warning
531 ;
532}
533
534#pragma clang diagnostic push
535#pragma clang diagnostic ignored "-Wlogical-op-parentheses"
536void test_identical_logical5(int x, int y) {
537 if (x == 4 && y == 5 || x == 4 && y == 6) // no-warning
538 ;
539}
540
541void test_identical_logical6(int x, int y) {
542 if (x == 4 && y == 5 || x == 4 && y == 5)
543 ;
544}
545
546void test_identical_logical7(int x, int y) {
547 // FIXME: We should warn here
548 if (x == 4 && y == 5 || x == 4)
549 ;
550}
551
552void test_identical_logical8(int x, int y) {
553 // FIXME: We should warn here
554 if (x == 4 || y == 5 && x == 4)
555 ;
556}
557
558void test_identical_logical9(int x, int y) {
559 // FIXME: We should warn here
560 if (x == 4 || x == 4 && y == 5)
561 ;
562}
563#pragma clang diagnostic pop
564
565void test_warn_chained_if_stmts_1(int x) {
566 if (x == 1)
567 ;
568// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
569// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
570 else if (x == 1)
571 ;
572// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
573}
574
575void test_warn_chained_if_stmts_2(int x) {
576 if (x == 1)
577 ;
578// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
579// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
580 else if (x == 1)
581 ;
582// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
583 else if (x == 1)
584 ;
585// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
586}
587
588void test_warn_chained_if_stmts_3(int x) {
589 if (x == 1)
590 ;
591// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
592// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
593 else if (x == 2)
594 ;
595// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
596 else if (x == 1)
597 ;
598// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
599}
600
601void test_warn_chained_if_stmts_4(int x) {
602 if (x == 1)
603 ;
604// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
605// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
606 else if (func())
607 ;
608// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
609 else if (x == 1)
610 ;
611// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
612}
613
614void test_warn_chained_if_stmts_5(int x) {
615 if (x & 1)
616 ;
617// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
618// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
619 else if (x & 1)
620 ;
621// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
622}
623
624void test_warn_chained_if_stmts_6(int x) {
625 if (x == 1)
626 ;
627// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
628// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
629 else if (x == 2)
630 ;
631// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
632 else if (x == 2)
633 ;
634// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
635 else if (x == 3)
636 ;
637}
638
639void test_warn_chained_if_stmts_7(int x) {
640 if (x == 1)
641 ;
642// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
643// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
644 else if (x == 2)
645 ;
646// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
647 else if (x == 3)
648 ;
649// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
650 else if (x == 2)
651 ;
652// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 3 starts here
653 else if (x == 5)
654 ;
655// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 4 starts here
656}
657
658void test_warn_chained_if_stmts_8(int x) {
659 if (x == 1)
660 ;
661// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
662// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
663 else if (x == 2)
664 ;
665// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
666 else if (x == 3)
667 ;
668// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
669 else if (x == 2)
670 ;
671// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 3 starts here
672 else if (x == 5)
673 ;
674// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 4 starts here
675 else if (x == 3)
676 ;
677// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 5 starts here
678 else if (x == 7)
679 ;
680// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 6 starts here
681}
682
683void test_nowarn_chained_if_stmts_1(int x) {
684 if (func())
685 ;
686// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
687// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
688 else if (func())
689 ;
690// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
691}
692
693void test_nowarn_chained_if_stmts_2(int x) {
694 if (func())
695 ;
696// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
697// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
698 else if (x == 1)
699 ;
700// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
701 else if (func())
702 ;
703// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here
704}
705
706void test_nowarn_chained_if_stmts_3(int x) {
707 if (x++)
708 ;
709// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone]
710// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original
711 else if (x++)
712 ;
713// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here
714}
715
716void test_warn_wchar() {
717 const wchar_t * a = 0 ? L"Warning" : L"Warning";
718// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: conditional operator with identical true and false expressions [bugprone-branch-clone]
719}
720void test_nowarn_wchar() {
721 const wchar_t * a = 0 ? L"No" : L"Warning";
722}
723
724void test_nowarn_long() {
725 int a = 0, b = 0;
726 long c;
727 if (0) {
728 b -= a;
729 c = 0;
730 } else {
731 b -= a;
732 c = 0LL;
733 }
734}
735
736// Identical inner conditions
737
738void test_warn_inner_if_1(int x) {
739 if (x == 1) {
740// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical inner if statement [bugprone-branch-clone]
741 if (x == 1)
742// CHECK-MESSAGES: :[[@LINE-1]]:5: note: inner if starts here
743 ;
744 }
745
746 // FIXME: Should warn here. The warning is currently not emitted because there
747 // is code between the conditions.
748 if (x == 1) {
749 int y = x;
750 if (x == 1)
751 ;
752 }
753}
754
755void test_nowarn_inner_if_1(int x) {
756 // Don't warn when condition has side effects.
757 if (x++ == 1) {
758 if (x++ == 1)
759 ;
760 }
761
762 // Don't warn when x is changed before inner condition.
763 if (x < 10) {
764 x++;
765 if (x < 10)
766 ;
767 }
768}
769

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-2.cpp