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