1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.IdenticalExpr -w -verify %s
2
3 /* Only one expected warning per function allowed at the very end. */
4
func(void)5 int func(void)
6 {
7 return 0;
8 }
9
func2(void)10 int func2(void)
11 {
12 return 0;
13 }
14
funcParam(int a)15 int funcParam(int a)
16 {
17 return 0;
18 }
19
20 /* '!=' operator*/
21
22 /* '!=' with float */
checkNotEqualFloatLiteralCompare1(void)23 int checkNotEqualFloatLiteralCompare1(void) {
24 return (5.14F != 5.14F); // no warning
25 }
26
checkNotEqualFloatLiteralCompare2(void)27 int checkNotEqualFloatLiteralCompare2(void) {
28 return (6.14F != 7.14F); // no warning
29 }
30
checkNotEqualFloatDeclCompare1(void)31 int checkNotEqualFloatDeclCompare1(void) {
32 float f = 7.1F;
33 float g = 7.1F;
34 return (f != g); // no warning
35 }
36
checkNotEqualFloatDeclCompare12(void)37 int checkNotEqualFloatDeclCompare12(void) {
38 float f = 7.1F;
39 return (f != f); // no warning
40 }
41
checkNotEqualFloatDeclCompare3(void)42 int checkNotEqualFloatDeclCompare3(void) {
43 float f = 7.1F;
44 return (f != 7.1F); // no warning
45 }
46
checkNotEqualFloatDeclCompare4(void)47 int checkNotEqualFloatDeclCompare4(void) {
48 float f = 7.1F;
49 return (7.1F != f); // no warning
50 }
51
checkNotEqualFloatDeclCompare5(void)52 int checkNotEqualFloatDeclCompare5(void) {
53 float f = 7.1F;
54 int t = 7;
55 return (t != f); // no warning
56 }
57
checkNotEqualFloatDeclCompare6(void)58 int checkNotEqualFloatDeclCompare6(void) {
59 float f = 7.1F;
60 int t = 7;
61 return (f != t); // no warning
62 }
63
64
65
checkNotEqualCastFloatDeclCompare11(void)66 int checkNotEqualCastFloatDeclCompare11(void) {
67 float f = 7.1F;
68 return ((int)f != (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
69 }
checkNotEqualCastFloatDeclCompare12(void)70 int checkNotEqualCastFloatDeclCompare12(void) {
71 float f = 7.1F;
72 return ((char)f != (int)f); // no warning
73 }
checkNotEqualBinaryOpFloatCompare1(void)74 int checkNotEqualBinaryOpFloatCompare1(void) {
75 int res;
76 float f= 3.14F;
77 res = (f + 3.14F != f + 3.14F); // no warning
78 return (0);
79 }
checkNotEqualBinaryOpFloatCompare2(void)80 int checkNotEqualBinaryOpFloatCompare2(void) {
81 float f = 7.1F;
82 float g = 7.1F;
83 return (f + 3.14F != g + 3.14F); // no warning
84 }
checkNotEqualBinaryOpFloatCompare3(void)85 int checkNotEqualBinaryOpFloatCompare3(void) {
86 int res;
87 float f= 3.14F;
88 res = ((int)f + 3.14F != (int)f + 3.14F); // no warning
89 return (0);
90 }
checkNotEqualBinaryOpFloatCompare4(void)91 int checkNotEqualBinaryOpFloatCompare4(void) {
92 int res;
93 float f= 3.14F;
94 res = ((int)f + 3.14F != (char)f + 3.14F); // no warning
95 return (0);
96 }
97
checkNotEqualNestedBinaryOpFloatCompare1(void)98 int checkNotEqualNestedBinaryOpFloatCompare1(void) {
99 int res;
100 int t= 1;
101 int u= 2;
102 float f= 3.14F;
103 res = (((int)f + (3.14F - u)*t) != ((int)f + (3.14F - u)*t)); // no warning
104 return (0);
105 }
106
checkNotEqualNestedBinaryOpFloatCompare2(void)107 int checkNotEqualNestedBinaryOpFloatCompare2(void) {
108 int res;
109 int t= 1;
110 int u= 2;
111 float f= 3.14F;
112 res = (((int)f + (u - 3.14F)*t) != ((int)f + (3.14F - u)*t)); // no warning
113 return (0);
114 }
115
checkNotEqualNestedBinaryOpFloatCompare3(void)116 int checkNotEqualNestedBinaryOpFloatCompare3(void) {
117 int res;
118 int t= 1;
119 int u= 2;
120 float f= 3.14F;
121 res = (((int)f + (u - 3.14F)*t) != ((int)f + (3.14F - u)*(f + t != f + t))); // no warning
122 return (0);
123 }
124
125
126
127
128 /* end '!=' with float*/
129
130 /* '!=' with int*/
131
checkNotEqualIntLiteralCompare1(void)132 int checkNotEqualIntLiteralCompare1(void) {
133 return (5 != 5); // expected-warning {{comparison of identical expressions always evaluates to false}}
134 }
135
checkNotEqualIntLiteralCompare2(void)136 int checkNotEqualIntLiteralCompare2(void) {
137 return (6 != 7); // no warning
138 }
139
checkNotEqualIntDeclCompare1(void)140 int checkNotEqualIntDeclCompare1(void) {
141 int f = 7;
142 int g = 7;
143 return (f != g); // no warning
144 }
145
checkNotEqualIntDeclCompare3(void)146 int checkNotEqualIntDeclCompare3(void) {
147 int f = 7;
148 return (f != 7); // no warning
149 }
150
checkNotEqualIntDeclCompare4(void)151 int checkNotEqualIntDeclCompare4(void) {
152 int f = 7;
153 return (7 != f); // no warning
154 }
155
checkNotEqualCastIntDeclCompare11(void)156 int checkNotEqualCastIntDeclCompare11(void) {
157 int f = 7;
158 return ((int)f != (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
159 }
checkNotEqualCastIntDeclCompare12(void)160 int checkNotEqualCastIntDeclCompare12(void) {
161 int f = 7;
162 return ((char)f != (int)f); // no warning
163 }
checkNotEqualBinaryOpIntCompare1(void)164 int checkNotEqualBinaryOpIntCompare1(void) {
165 int res;
166 int t= 1;
167 int u= 2;
168 int f= 4;
169 res = (f + 4 != f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}}
170 return (0);
171 }
checkNotEqualBinaryOpIntCompare2(void)172 int checkNotEqualBinaryOpIntCompare2(void) {
173 int f = 7;
174 int g = 7;
175 return (f + 4 != g + 4); // no warning
176 }
177
178
checkNotEqualBinaryOpIntCompare3(void)179 int checkNotEqualBinaryOpIntCompare3(void) {
180 int res;
181 int t= 1;
182 int u= 2;
183 int f= 4;
184 res = ((int)f + 4 != (int)f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}}
185 return (0);
186 }
checkNotEqualBinaryOpIntCompare4(void)187 int checkNotEqualBinaryOpIntCompare4(void) {
188 int res;
189 int t= 1;
190 int u= 2;
191 int f= 4;
192 res = ((int)f + 4 != (char)f + 4); // no warning
193 return (0);
194 }
checkNotEqualBinaryOpIntCompare5(void)195 int checkNotEqualBinaryOpIntCompare5(void) {
196 int res;
197 int t= 1;
198 int u= 2;
199 res = (u + t != u + t); // expected-warning {{comparison of identical expressions always evaluates to false}}
200 return (0);
201 }
202
checkNotEqualNestedBinaryOpIntCompare1(void)203 int checkNotEqualNestedBinaryOpIntCompare1(void) {
204 int res;
205 int t= 1;
206 int u= 2;
207 int f= 3;
208 res = (((int)f + (3 - u)*t) != ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}}
209 return (0);
210 }
211
checkNotEqualNestedBinaryOpIntCompare2(void)212 int checkNotEqualNestedBinaryOpIntCompare2(void) {
213 int res;
214 int t= 1;
215 int u= 2;
216 int f= 3;
217 res = (((int)f + (u - 3)*t) != ((int)f + (3 - u)*t)); // no warning
218 return (0);
219 }
220
checkNotEqualNestedBinaryOpIntCompare3(void)221 int checkNotEqualNestedBinaryOpIntCompare3(void) {
222 int res;
223 int t= 1;
224 int u= 2;
225 int f= 3;
226 res = (((int)f + (u - 3)*t) != ((int)f + (3 - u)*(t + 1 != t + 1))); // expected-warning {{comparison of identical expressions always evaluates to false}}
227 return (0);
228 }
229
230 /* end '!=' int */
231
232
233
234 /* '!=' with int pointer */
235
checkNotEqualIntPointerLiteralCompare1(void)236 int checkNotEqualIntPointerLiteralCompare1(void) {
237 int* p = 0;
238 return (p != 0); // no warning
239 }
240
checkNotEqualIntPointerLiteralCompare2(void)241 int checkNotEqualIntPointerLiteralCompare2(void) {
242 return (6 != 7); // no warning
243 }
244
checkNotEqualIntPointerDeclCompare1(void)245 int checkNotEqualIntPointerDeclCompare1(void) {
246 int k = 3;
247 int* f = &k;
248 int* g = &k;
249 return (f != g); // no warning
250 }
251
checkNotEqualCastIntPointerDeclCompare11(void)252 int checkNotEqualCastIntPointerDeclCompare11(void) {
253 int k = 7;
254 int* f = &k;
255 return ((int*)f != (int*)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
256 }
checkNotEqualCastIntPointerDeclCompare12(void)257 int checkNotEqualCastIntPointerDeclCompare12(void) {
258 int k = 7;
259 int* f = &k;
260 return ((int*)((char*)f) != (int*)f); // no warning
261 }
checkNotEqualBinaryOpIntPointerCompare1(void)262 int checkNotEqualBinaryOpIntPointerCompare1(void) {
263 int k = 7;
264 int res;
265 int* f= &k;
266 res = (f + 4 != f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}}
267 return (0);
268 }
checkNotEqualBinaryOpIntPointerCompare2(void)269 int checkNotEqualBinaryOpIntPointerCompare2(void) {
270 int k = 7;
271 int* f = &k;
272 int* g = &k;
273 return (f + 4 != g + 4); // no warning
274 }
275
276
checkNotEqualBinaryOpIntPointerCompare3(void)277 int checkNotEqualBinaryOpIntPointerCompare3(void) {
278 int k = 7;
279 int res;
280 int* f= &k;
281 res = ((int*)f + 4 != (int*)f + 4); // expected-warning {{comparison of identical expressions always evaluates to false}}
282 return (0);
283 }
checkNotEqualBinaryOpIntPointerCompare4(void)284 int checkNotEqualBinaryOpIntPointerCompare4(void) {
285 int k = 7;
286 int res;
287 int* f= &k;
288 res = ((int*)f + 4 != (int*)((char*)f) + 4); // no warning
289 return (0);
290 }
291
checkNotEqualNestedBinaryOpIntPointerCompare1(void)292 int checkNotEqualNestedBinaryOpIntPointerCompare1(void) {
293 int res;
294 int k = 7;
295 int t= 1;
296 int* u= &k+2;
297 int* f= &k+3;
298 res = ((f + (3)*t) != (f + (3)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}}
299 return (0);
300 }
301
checkNotEqualNestedBinaryOpIntPointerCompare2(void)302 int checkNotEqualNestedBinaryOpIntPointerCompare2(void) {
303 int res;
304 int k = 7;
305 int t= 1;
306 int* u= &k+2;
307 int* f= &k+3;
308 res = (((3)*t + f) != (f + (3)*t)); // no warning
309 return (0);
310 }
311 /* end '!=' int* */
312
313 /* '!=' with function*/
314
checkNotEqualSameFunction()315 int checkNotEqualSameFunction() {
316 unsigned a = 0;
317 unsigned b = 1;
318 int res = (a+func() != a+func()); // no warning
319 return (0);
320 }
321
checkNotEqualDifferentFunction()322 int checkNotEqualDifferentFunction() {
323 unsigned a = 0;
324 unsigned b = 1;
325 int res = (a+func() != a+func2()); // no warning
326 return (0);
327 }
328
checkNotEqualSameFunctionSameParam()329 int checkNotEqualSameFunctionSameParam() {
330 unsigned a = 0;
331 unsigned b = 1;
332 int res = (a+funcParam(a) != a+funcParam(a)); // no warning
333 return (0);
334 }
335
checkNotEqualSameFunctionDifferentParam()336 int checkNotEqualSameFunctionDifferentParam() {
337 unsigned a = 0;
338 unsigned b = 1;
339 int res = (a+funcParam(a) != a+funcParam(b)); // no warning
340 return (0);
341 }
342
343 /* end '!=' with function*/
344
345 /* end '!=' */
346
347
348
349 /* EQ operator */
350
checkEqualIntPointerDeclCompare(void)351 int checkEqualIntPointerDeclCompare(void) {
352 int k = 3;
353 int* f = &k;
354 int* g = &k;
355 return (f == g); // no warning
356 }
357
checkEqualIntPointerDeclCompare0(void)358 int checkEqualIntPointerDeclCompare0(void) {
359 int k = 3;
360 int* f = &k;
361 return (f+1 == f+1); // expected-warning {{comparison of identical expressions always evaluates to true}}
362 }
363
364 /* EQ with float*/
365
checkEqualFloatLiteralCompare1(void)366 int checkEqualFloatLiteralCompare1(void) {
367 return (5.14F == 5.14F); // no warning
368 }
369
checkEqualFloatLiteralCompare2(void)370 int checkEqualFloatLiteralCompare2(void) {
371 return (6.14F == 7.14F); // no warning
372 }
373
checkEqualFloatDeclCompare1(void)374 int checkEqualFloatDeclCompare1(void) {
375 float f = 7.1F;
376 float g = 7.1F;
377 return (f == g); // no warning
378 }
379
checkEqualFloatDeclCompare12(void)380 int checkEqualFloatDeclCompare12(void) {
381 float f = 7.1F;
382 return (f == f); // no warning
383 }
384
385
checkEqualFloatDeclCompare3(void)386 int checkEqualFloatDeclCompare3(void) {
387 float f = 7.1F;
388 return (f == 7.1F); // no warning
389 }
390
checkEqualFloatDeclCompare4(void)391 int checkEqualFloatDeclCompare4(void) {
392 float f = 7.1F;
393 return (7.1F == f); // no warning
394 }
395
checkEqualFloatDeclCompare5(void)396 int checkEqualFloatDeclCompare5(void) {
397 float f = 7.1F;
398 int t = 7;
399 return (t == f); // no warning
400 }
401
checkEqualFloatDeclCompare6(void)402 int checkEqualFloatDeclCompare6(void) {
403 float f = 7.1F;
404 int t = 7;
405 return (f == t); // no warning
406 }
407
408
409
410
checkEqualCastFloatDeclCompare11(void)411 int checkEqualCastFloatDeclCompare11(void) {
412 float f = 7.1F;
413 return ((int)f == (int)f); // expected-warning {{comparison of identical expressions always evaluates to true}}
414 }
checkEqualCastFloatDeclCompare12(void)415 int checkEqualCastFloatDeclCompare12(void) {
416 float f = 7.1F;
417 return ((char)f == (int)f); // no warning
418 }
checkEqualBinaryOpFloatCompare1(void)419 int checkEqualBinaryOpFloatCompare1(void) {
420 int res;
421 float f= 3.14F;
422 res = (f + 3.14F == f + 3.14F); // no warning
423 return (0);
424 }
checkEqualBinaryOpFloatCompare2(void)425 int checkEqualBinaryOpFloatCompare2(void) {
426 float f = 7.1F;
427 float g = 7.1F;
428 return (f + 3.14F == g + 3.14F); // no warning
429 }
checkEqualBinaryOpFloatCompare3(void)430 int checkEqualBinaryOpFloatCompare3(void) {
431 int res;
432 float f= 3.14F;
433 res = ((int)f + 3.14F == (int)f + 3.14F); // no warning
434 return (0);
435 }
checkEqualBinaryOpFloatCompare4(void)436 int checkEqualBinaryOpFloatCompare4(void) {
437 int res;
438 float f= 3.14F;
439 res = ((int)f + 3.14F == (char)f + 3.14F); // no warning
440 return (0);
441 }
442
checkEqualNestedBinaryOpFloatCompare1(void)443 int checkEqualNestedBinaryOpFloatCompare1(void) {
444 int res;
445 int t= 1;
446 int u= 2;
447 float f= 3.14F;
448 res = (((int)f + (3.14F - u)*t) == ((int)f + (3.14F - u)*t)); // no warning
449 return (0);
450 }
451
checkEqualNestedBinaryOpFloatCompare2(void)452 int checkEqualNestedBinaryOpFloatCompare2(void) {
453 int res;
454 int t= 1;
455 int u= 2;
456 float f= 3.14F;
457 res = (((int)f + (u - 3.14F)*t) == ((int)f + (3.14F - u)*t)); // no warning
458 return (0);
459 }
460
checkEqualNestedBinaryOpFloatCompare3(void)461 int checkEqualNestedBinaryOpFloatCompare3(void) {
462 int res;
463 int t= 1;
464 int u= 2;
465 float f= 3.14F;
466 res = (((int)f + (u - 3.14F)*t) == ((int)f + (3.14F - u)*(f + t == f + t))); // no warning
467 return (0);
468 }
469
470
471
472
473
474 /* Equal with int*/
475
checkEqualIntLiteralCompare1(void)476 int checkEqualIntLiteralCompare1(void) {
477 return (5 == 5); // expected-warning {{comparison of identical expressions always evaluates to true}}
478 }
479
checkEqualIntLiteralCompare2(void)480 int checkEqualIntLiteralCompare2(void) {
481 return (6 == 7); // no warning
482 }
483
checkEqualIntDeclCompare1(void)484 int checkEqualIntDeclCompare1(void) {
485 int f = 7;
486 int g = 7;
487 return (f == g); // no warning
488 }
489
checkEqualCastIntDeclCompare11(void)490 int checkEqualCastIntDeclCompare11(void) {
491 int f = 7;
492 return ((int)f == (int)f); // expected-warning {{comparison of identical expressions always evaluates to true}}
493 }
checkEqualCastIntDeclCompare12(void)494 int checkEqualCastIntDeclCompare12(void) {
495 int f = 7;
496 return ((char)f == (int)f); // no warning
497 }
498
checkEqualIntDeclCompare3(void)499 int checkEqualIntDeclCompare3(void) {
500 int f = 7;
501 return (f == 7); // no warning
502 }
503
checkEqualIntDeclCompare4(void)504 int checkEqualIntDeclCompare4(void) {
505 int f = 7;
506 return (7 == f); // no warning
507 }
508
checkEqualBinaryOpIntCompare1(void)509 int checkEqualBinaryOpIntCompare1(void) {
510 int res;
511 int t= 1;
512 int u= 2;
513 int f= 4;
514 res = (f + 4 == f + 4); // expected-warning {{comparison of identical expressions always evaluates to true}}
515 return (0);
516 }
checkEqualBinaryOpIntCompare2(void)517 int checkEqualBinaryOpIntCompare2(void) {
518 int f = 7;
519 int g = 7;
520 return (f + 4 == g + 4); // no warning
521 }
522
523
checkEqualBinaryOpIntCompare3(void)524 int checkEqualBinaryOpIntCompare3(void) {
525 int res;
526 int t= 1;
527 int u= 2;
528 int f= 4;
529 res = ((int)f + 4 == (int)f + 4); // expected-warning {{comparison of identical expressions always evaluates to true}}
530 return (0);
531
532 }
checkEqualBinaryOpIntCompare4(void)533 int checkEqualBinaryOpIntCompare4(void) {
534 int res;
535 int t= 1;
536 int u= 2;
537 int f= 4;
538 res = ((int)f + 4 == (char)f + 4); // no warning
539 return (0);
540 }
checkEqualBinaryOpIntCompare5(void)541 int checkEqualBinaryOpIntCompare5(void) {
542 int res;
543 int t= 1;
544 int u= 2;
545 res = (u + t == u + t); // expected-warning {{comparison of identical expressions always evaluates to true}}
546 return (0);
547 }
548
checkEqualNestedBinaryOpIntCompare1(void)549 int checkEqualNestedBinaryOpIntCompare1(void) {
550 int res;
551 int t= 1;
552 int u= 2;
553 int f= 3;
554 res = (((int)f + (3 - u)*t) == ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to true}}
555 return (0);
556 }
557
checkEqualNestedBinaryOpIntCompare2(void)558 int checkEqualNestedBinaryOpIntCompare2(void) {
559 int res;
560 int t= 1;
561 int u= 2;
562 int f= 3;
563 res = (((int)f + (u - 3)*t) == ((int)f + (3 - u)*t)); // no warning
564 return (0);
565 }
566
checkEqualNestedBinaryOpIntCompare3(void)567 int checkEqualNestedBinaryOpIntCompare3(void) {
568 int res;
569 int t= 1;
570 int u= 2;
571 int f= 3;
572 res = (((int)f + (u - 3)*t) == ((int)f + (3 - u)*(t + 1 == t + 1))); // expected-warning {{comparison of identical expressions always evaluates to true}}
573 return (0);
574 }
575
576 /* '==' with function*/
577
checkEqualSameFunction()578 int checkEqualSameFunction() {
579 unsigned a = 0;
580 unsigned b = 1;
581 int res = (a+func() == a+func()); // no warning
582 return (0);
583 }
584
checkEqualDifferentFunction()585 int checkEqualDifferentFunction() {
586 unsigned a = 0;
587 unsigned b = 1;
588 int res = (a+func() == a+func2()); // no warning
589 return (0);
590 }
591
checkEqualSameFunctionSameParam()592 int checkEqualSameFunctionSameParam() {
593 unsigned a = 0;
594 unsigned b = 1;
595 int res = (a+funcParam(a) == a+funcParam(a)); // no warning
596 return (0);
597 }
598
checkEqualSameFunctionDifferentParam()599 int checkEqualSameFunctionDifferentParam() {
600 unsigned a = 0;
601 unsigned b = 1;
602 int res = (a+funcParam(a) == a+funcParam(b)); // no warning
603 return (0);
604 }
605
606 /* end '==' with function*/
607
608 /* end EQ int */
609
610 /* end EQ */
611
612
613 /* LT */
614
615 /* LT with float */
616
checkLessThanFloatLiteralCompare1(void)617 int checkLessThanFloatLiteralCompare1(void) {
618 return (5.14F < 5.14F); // expected-warning {{comparison of identical expressions always evaluates to false}}
619 }
620
checkLessThanFloatLiteralCompare2(void)621 int checkLessThanFloatLiteralCompare2(void) {
622 return (6.14F < 7.14F); // no warning
623 }
624
checkLessThanFloatDeclCompare1(void)625 int checkLessThanFloatDeclCompare1(void) {
626 float f = 7.1F;
627 float g = 7.1F;
628 return (f < g); // no warning
629 }
630
checkLessThanFloatDeclCompare12(void)631 int checkLessThanFloatDeclCompare12(void) {
632 float f = 7.1F;
633 return (f < f); // expected-warning {{comparison of identical expressions always evaluates to false}}
634 }
635
checkLessThanFloatDeclCompare3(void)636 int checkLessThanFloatDeclCompare3(void) {
637 float f = 7.1F;
638 return (f < 7.1F); // no warning
639 }
640
checkLessThanFloatDeclCompare4(void)641 int checkLessThanFloatDeclCompare4(void) {
642 float f = 7.1F;
643 return (7.1F < f); // no warning
644 }
645
checkLessThanFloatDeclCompare5(void)646 int checkLessThanFloatDeclCompare5(void) {
647 float f = 7.1F;
648 int t = 7;
649 return (t < f); // no warning
650 }
651
checkLessThanFloatDeclCompare6(void)652 int checkLessThanFloatDeclCompare6(void) {
653 float f = 7.1F;
654 int t = 7;
655 return (f < t); // no warning
656 }
657
658
checkLessThanCastFloatDeclCompare11(void)659 int checkLessThanCastFloatDeclCompare11(void) {
660 float f = 7.1F;
661 return ((int)f < (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
662 }
checkLessThanCastFloatDeclCompare12(void)663 int checkLessThanCastFloatDeclCompare12(void) {
664 float f = 7.1F;
665 return ((char)f < (int)f); // no warning
666 }
checkLessThanBinaryOpFloatCompare1(void)667 int checkLessThanBinaryOpFloatCompare1(void) {
668 int res;
669 float f= 3.14F;
670 res = (f + 3.14F < f + 3.14F); // no warning
671 return (0);
672 }
checkLessThanBinaryOpFloatCompare2(void)673 int checkLessThanBinaryOpFloatCompare2(void) {
674 float f = 7.1F;
675 float g = 7.1F;
676 return (f + 3.14F < g + 3.14F); // no warning
677 }
checkLessThanBinaryOpFloatCompare3(void)678 int checkLessThanBinaryOpFloatCompare3(void) {
679 int res;
680 float f= 3.14F;
681 res = ((int)f + 3.14F < (int)f + 3.14F); // no warning
682 return (0);
683 }
checkLessThanBinaryOpFloatCompare4(void)684 int checkLessThanBinaryOpFloatCompare4(void) {
685 int res;
686 float f= 3.14F;
687 res = ((int)f + 3.14F < (char)f + 3.14F); // no warning
688 return (0);
689 }
690
checkLessThanNestedBinaryOpFloatCompare1(void)691 int checkLessThanNestedBinaryOpFloatCompare1(void) {
692 int res;
693 int t= 1;
694 int u= 2;
695 float f= 3.14F;
696 res = (((int)f + (3.14F - u)*t) < ((int)f + (3.14F - u)*t)); // no warning
697 return (0);
698 }
699
checkLessThanNestedBinaryOpFloatCompare2(void)700 int checkLessThanNestedBinaryOpFloatCompare2(void) {
701 int res;
702 int t= 1;
703 int u= 2;
704 float f= 3.14F;
705 res = (((int)f + (u - 3.14F)*t) < ((int)f + (3.14F - u)*t)); // no warning
706 return (0);
707 }
708
checkLessThanNestedBinaryOpFloatCompare3(void)709 int checkLessThanNestedBinaryOpFloatCompare3(void) {
710 int res;
711 int t= 1;
712 int u= 2;
713 float f= 3.14F;
714 res = (((int)f + (u - 3.14F)*t) < ((int)f + (3.14F - u)*(f + t < f + t))); // no warning
715 return (0);
716 }
717
718 /* end LT with float */
719
720 /* LT with int */
721
722
checkLessThanIntLiteralCompare1(void)723 int checkLessThanIntLiteralCompare1(void) {
724 return (5 < 5); // expected-warning {{comparison of identical expressions always evaluates to false}}
725 }
726
checkLessThanIntLiteralCompare2(void)727 int checkLessThanIntLiteralCompare2(void) {
728 return (6 < 7); // no warning
729 }
730
checkLessThanIntDeclCompare1(void)731 int checkLessThanIntDeclCompare1(void) {
732 int f = 7;
733 int g = 7;
734 return (f < g); // no warning
735 }
736
checkLessThanIntDeclCompare3(void)737 int checkLessThanIntDeclCompare3(void) {
738 int f = 7;
739 return (f < 7); // no warning
740 }
741
checkLessThanIntDeclCompare4(void)742 int checkLessThanIntDeclCompare4(void) {
743 int f = 7;
744 return (7 < f); // no warning
745 }
746
checkLessThanIntDeclCompare5(void)747 int checkLessThanIntDeclCompare5(void) {
748 int f = 7;
749 int t = 7;
750 return (t < f); // no warning
751 }
752
checkLessThanIntDeclCompare6(void)753 int checkLessThanIntDeclCompare6(void) {
754 int f = 7;
755 int t = 7;
756 return (f < t); // no warning
757 }
758
checkLessThanCastIntDeclCompare11(void)759 int checkLessThanCastIntDeclCompare11(void) {
760 int f = 7;
761 return ((int)f < (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
762 }
checkLessThanCastIntDeclCompare12(void)763 int checkLessThanCastIntDeclCompare12(void) {
764 int f = 7;
765 return ((char)f < (int)f); // no warning
766 }
checkLessThanBinaryOpIntCompare1(void)767 int checkLessThanBinaryOpIntCompare1(void) {
768 int res;
769 int f= 3;
770 res = (f + 3 < f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}}
771 return (0);
772 }
checkLessThanBinaryOpIntCompare2(void)773 int checkLessThanBinaryOpIntCompare2(void) {
774 int f = 7;
775 int g = 7;
776 return (f + 3 < g + 3); // no warning
777 }
checkLessThanBinaryOpIntCompare3(void)778 int checkLessThanBinaryOpIntCompare3(void) {
779 int res;
780 int f= 3;
781 res = ((int)f + 3 < (int)f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}}
782 return (0);
783 }
checkLessThanBinaryOpIntCompare4(void)784 int checkLessThanBinaryOpIntCompare4(void) {
785 int res;
786 int f= 3;
787 res = ((int)f + 3 < (char)f + 3); // no warning
788 return (0);
789 }
790
checkLessThanNestedBinaryOpIntCompare1(void)791 int checkLessThanNestedBinaryOpIntCompare1(void) {
792 int res;
793 int t= 1;
794 int u= 2;
795 int f= 3;
796 res = (((int)f + (3 - u)*t) < ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}}
797 return (0);
798 }
799
checkLessThanNestedBinaryOpIntCompare2(void)800 int checkLessThanNestedBinaryOpIntCompare2(void) {
801 int res;
802 int t= 1;
803 int u= 2;
804 int f= 3;
805 res = (((int)f + (u - 3)*t) < ((int)f + (3 - u)*t)); // no warning
806 return (0);
807 }
808
checkLessThanNestedBinaryOpIntCompare3(void)809 int checkLessThanNestedBinaryOpIntCompare3(void) {
810 int res;
811 int t= 1;
812 int u= 2;
813 int f= 3;
814 res = (((int)f + (u - 3)*t) < ((int)f + (3 - u)*(t + u < t + u))); // expected-warning {{comparison of identical expressions always evaluates to false}}
815 return (0);
816 }
817
818 /* end LT with int */
819
820 /* end LT */
821
822
823 /* GT */
824
825 /* GT with float */
826
checkGreaterThanFloatLiteralCompare1(void)827 int checkGreaterThanFloatLiteralCompare1(void) {
828 return (5.14F > 5.14F); // expected-warning {{comparison of identical expressions always evaluates to false}}
829 }
830
checkGreaterThanFloatLiteralCompare2(void)831 int checkGreaterThanFloatLiteralCompare2(void) {
832 return (6.14F > 7.14F); // no warning
833 }
834
checkGreaterThanFloatDeclCompare1(void)835 int checkGreaterThanFloatDeclCompare1(void) {
836 float f = 7.1F;
837 float g = 7.1F;
838
839 return (f > g); // no warning
840 }
841
checkGreaterThanFloatDeclCompare12(void)842 int checkGreaterThanFloatDeclCompare12(void) {
843 float f = 7.1F;
844 return (f > f); // expected-warning {{comparison of identical expressions always evaluates to false}}
845 }
846
847
checkGreaterThanFloatDeclCompare3(void)848 int checkGreaterThanFloatDeclCompare3(void) {
849 float f = 7.1F;
850 return (f > 7.1F); // no warning
851 }
852
checkGreaterThanFloatDeclCompare4(void)853 int checkGreaterThanFloatDeclCompare4(void) {
854 float f = 7.1F;
855 return (7.1F > f); // no warning
856 }
857
checkGreaterThanFloatDeclCompare5(void)858 int checkGreaterThanFloatDeclCompare5(void) {
859 float f = 7.1F;
860 int t = 7;
861 return (t > f); // no warning
862 }
863
checkGreaterThanFloatDeclCompare6(void)864 int checkGreaterThanFloatDeclCompare6(void) {
865 float f = 7.1F;
866 int t = 7;
867 return (f > t); // no warning
868 }
869
checkGreaterThanCastFloatDeclCompare11(void)870 int checkGreaterThanCastFloatDeclCompare11(void) {
871 float f = 7.1F;
872 return ((int)f > (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
873 }
checkGreaterThanCastFloatDeclCompare12(void)874 int checkGreaterThanCastFloatDeclCompare12(void) {
875 float f = 7.1F;
876 return ((char)f > (int)f); // no warning
877 }
checkGreaterThanBinaryOpFloatCompare1(void)878 int checkGreaterThanBinaryOpFloatCompare1(void) {
879 int res;
880 float f= 3.14F;
881 res = (f + 3.14F > f + 3.14F); // no warning
882 return (0);
883 }
checkGreaterThanBinaryOpFloatCompare2(void)884 int checkGreaterThanBinaryOpFloatCompare2(void) {
885 float f = 7.1F;
886 float g = 7.1F;
887 return (f + 3.14F > g + 3.14F); // no warning
888 }
checkGreaterThanBinaryOpFloatCompare3(void)889 int checkGreaterThanBinaryOpFloatCompare3(void) {
890 int res;
891 float f= 3.14F;
892 res = ((int)f + 3.14F > (int)f + 3.14F); // no warning
893 return (0);
894 }
checkGreaterThanBinaryOpFloatCompare4(void)895 int checkGreaterThanBinaryOpFloatCompare4(void) {
896 int res;
897 float f= 3.14F;
898 res = ((int)f + 3.14F > (char)f + 3.14F); // no warning
899 return (0);
900 }
901
checkGreaterThanNestedBinaryOpFloatCompare1(void)902 int checkGreaterThanNestedBinaryOpFloatCompare1(void) {
903 int res;
904 int t= 1;
905 int u= 2;
906 float f= 3.14F;
907 res = (((int)f + (3.14F - u)*t) > ((int)f + (3.14F - u)*t)); // no warning
908 return (0);
909 }
910
checkGreaterThanNestedBinaryOpFloatCompare2(void)911 int checkGreaterThanNestedBinaryOpFloatCompare2(void) {
912 int res;
913 int t= 1;
914 int u= 2;
915 float f= 3.14F;
916 res = (((int)f + (u - 3.14F)*t) > ((int)f + (3.14F - u)*t)); // no warning
917 return (0);
918 }
919
checkGreaterThanNestedBinaryOpFloatCompare3(void)920 int checkGreaterThanNestedBinaryOpFloatCompare3(void) {
921 int res;
922 int t= 1;
923 int u= 2;
924 float f= 3.14F;
925 res = (((int)f + (u - 3.14F)*t) > ((int)f + (3.14F - u)*(f + t > f + t))); // no warning
926 return (0);
927 }
928
929 /* end GT with float */
930
931 /* GT with int */
932
933
checkGreaterThanIntLiteralCompare1(void)934 int checkGreaterThanIntLiteralCompare1(void) {
935 return (5 > 5); // expected-warning {{comparison of identical expressions always evaluates to false}}
936 }
937
checkGreaterThanIntLiteralCompare2(void)938 int checkGreaterThanIntLiteralCompare2(void) {
939 return (6 > 7); // no warning
940 }
941
checkGreaterThanIntDeclCompare1(void)942 int checkGreaterThanIntDeclCompare1(void) {
943 int f = 7;
944 int g = 7;
945
946 return (f > g); // no warning
947 }
948
checkGreaterThanIntDeclCompare3(void)949 int checkGreaterThanIntDeclCompare3(void) {
950 int f = 7;
951 return (f > 7); // no warning
952 }
953
checkGreaterThanIntDeclCompare4(void)954 int checkGreaterThanIntDeclCompare4(void) {
955 int f = 7;
956 return (7 > f); // no warning
957 }
958
checkGreaterThanCastIntDeclCompare11(void)959 int checkGreaterThanCastIntDeclCompare11(void) {
960 int f = 7;
961 return ((int)f > (int)f); // expected-warning {{comparison of identical expressions always evaluates to false}}
962 }
checkGreaterThanCastIntDeclCompare12(void)963 int checkGreaterThanCastIntDeclCompare12(void) {
964 int f = 7;
965 return ((char)f > (int)f); // no warning
966 }
checkGreaterThanBinaryOpIntCompare1(void)967 int checkGreaterThanBinaryOpIntCompare1(void) {
968 int res;
969 int f= 3;
970 res = (f + 3 > f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}}
971 return (0);
972 }
checkGreaterThanBinaryOpIntCompare2(void)973 int checkGreaterThanBinaryOpIntCompare2(void) {
974 int f = 7;
975 int g = 7;
976 return (f + 3 > g + 3); // no warning
977 }
checkGreaterThanBinaryOpIntCompare3(void)978 int checkGreaterThanBinaryOpIntCompare3(void) {
979 int res;
980 int f= 3;
981 res = ((int)f + 3 > (int)f + 3); // expected-warning {{comparison of identical expressions always evaluates to false}}
982 return (0);
983 }
checkGreaterThanBinaryOpIntCompare4(void)984 int checkGreaterThanBinaryOpIntCompare4(void) {
985 int res;
986 int f= 3;
987 res = ((int)f + 3 > (char)f + 3); // no warning
988 return (0);
989 }
990
checkGreaterThanNestedBinaryOpIntCompare1(void)991 int checkGreaterThanNestedBinaryOpIntCompare1(void) {
992 int res;
993 int t= 1;
994 int u= 2;
995 int f= 3;
996 res = (((int)f + (3 - u)*t) > ((int)f + (3 - u)*t)); // expected-warning {{comparison of identical expressions always evaluates to false}}
997 return (0);
998 }
999
checkGreaterThanNestedBinaryOpIntCompare2(void)1000 int checkGreaterThanNestedBinaryOpIntCompare2(void) {
1001 int res;
1002 int t= 1;
1003 int u= 2;
1004 int f= 3;
1005 res = (((int)f + (u - 3)*t) > ((int)f + (3 - u)*t)); // no warning
1006 return (0);
1007 }
1008
checkGreaterThanNestedBinaryOpIntCompare3(void)1009 int checkGreaterThanNestedBinaryOpIntCompare3(void) {
1010 int res;
1011 int t= 1;
1012 int u= 2;
1013 int f= 3;
1014 res = (((int)f + (u - 3)*t) > ((int)f + (3 - u)*(t + u > t + u))); // expected-warning {{comparison of identical expressions always evaluates to false}}
1015 return (0);
1016 }
1017
1018 /* end GT with int */
1019
1020 /* end GT */
1021
1022
1023 /* Checking use of identical expressions in conditional operator*/
1024
test_unsigned(unsigned a)1025 unsigned test_unsigned(unsigned a) {
1026 unsigned b = 1;
1027 a = a > 5 ? b : b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1028 return a;
1029 }
1030
test_signed()1031 void test_signed() {
1032 int a = 0;
1033 a = a > 5 ? a : a; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1034 }
1035
test_bool(bool a)1036 void test_bool(bool a) {
1037 a = a > 0 ? a : a; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1038 }
1039
test_float()1040 void test_float() {
1041 float a = 0;
1042 float b = 0;
1043 a = a > 5 ? a : a; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1044 }
1045
test_string()1046 const char *test_string() {
1047 float a = 0;
1048 return a > 5 ? "abc" : "abc"; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1049 }
1050
test_unsigned_expr()1051 void test_unsigned_expr() {
1052 unsigned a = 0;
1053 unsigned b = 0;
1054 a = a > 5 ? a+b : a+b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1055 }
1056
test_signed_expr()1057 void test_signed_expr() {
1058 int a = 0;
1059 int b = 1;
1060 a = a > 5 ? a+b : a+b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1061 }
1062
test_bool_expr(bool a)1063 void test_bool_expr(bool a) {
1064 bool b = 0;
1065 a = a > 0 ? a&&b : a&&b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1066 }
1067
test_unsigned_expr_negative()1068 void test_unsigned_expr_negative() {
1069 unsigned a = 0;
1070 unsigned b = 0;
1071 a = a > 5 ? a+b : b+a; // no warning
1072 }
1073
test_signed_expr_negative()1074 void test_signed_expr_negative() {
1075 int a = 0;
1076 int b = 1;
1077 a = a > 5 ? b+a : a+b; // no warning
1078 }
1079
test_bool_expr_negative(bool a)1080 void test_bool_expr_negative(bool a) {
1081 bool b = 0;
1082 a = a > 0 ? a&&b : b&&a; // no warning
1083 }
1084
test_float_expr_positive()1085 void test_float_expr_positive() {
1086 float a = 0;
1087 float b = 0;
1088 a = a > 5 ? a+b : a+b; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1089 }
1090
test_expr_positive_func()1091 void test_expr_positive_func() {
1092 unsigned a = 0;
1093 unsigned b = 1;
1094 a = a > 5 ? a+func() : a+func(); // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1095 }
1096
test_expr_negative_func()1097 void test_expr_negative_func() {
1098 unsigned a = 0;
1099 unsigned b = 1;
1100 a = a > 5 ? a+func() : a+func2(); // no warning
1101 }
1102
test_expr_positive_funcParam()1103 void test_expr_positive_funcParam() {
1104 unsigned a = 0;
1105 unsigned b = 1;
1106 a = a > 5 ? a+funcParam(b) : a+funcParam(b); // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1107 }
1108
test_expr_negative_funcParam()1109 void test_expr_negative_funcParam() {
1110 unsigned a = 0;
1111 unsigned b = 1;
1112 a = a > 5 ? a+funcParam(a) : a+funcParam(b); // no warning
1113 }
1114
test_expr_positive_inc()1115 void test_expr_positive_inc() {
1116 unsigned a = 0;
1117 unsigned b = 1;
1118 a = a > 5 ? a++ : a++; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1119 }
1120
test_expr_negative_inc()1121 void test_expr_negative_inc() {
1122 unsigned a = 0;
1123 unsigned b = 1;
1124 a = a > 5 ? a++ : b++; // no warning
1125 }
1126
test_expr_positive_assign()1127 void test_expr_positive_assign() {
1128 unsigned a = 0;
1129 unsigned b = 1;
1130 a = a > 5 ? a=1 : a=1; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1131 }
1132
test_expr_negative_assign()1133 void test_expr_negative_assign() {
1134 unsigned a = 0;
1135 unsigned b = 1;
1136 a = a > 5 ? a=1 : a=2; // no warning
1137 }
1138
test_signed_nested_expr()1139 void test_signed_nested_expr() {
1140 int a = 0;
1141 int b = 1;
1142 int c = 3;
1143 a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a)); // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1144 }
1145
test_signed_nested_expr_negative()1146 void test_signed_nested_expr_negative() {
1147 int a = 0;
1148 int b = 1;
1149 int c = 3;
1150 a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(a+c)); // no warning
1151 }
1152
test_signed_nested_cond_expr_negative()1153 void test_signed_nested_cond_expr_negative() {
1154 int a = 0;
1155 int b = 1;
1156 int c = 3;
1157 a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 2 : 4); // no warning
1158 }
1159
test_signed_nested_cond_expr()1160 void test_signed_nested_cond_expr() {
1161 int a = 0;
1162 int b = 1;
1163 int c = 3;
1164 a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4); // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1165 }
1166
test_identical_branches1(bool b)1167 void test_identical_branches1(bool b) {
1168 int i = 0;
1169 if (b) { // expected-warning {{true and false branches are identical}}
1170 ++i;
1171 } else {
1172 ++i;
1173 }
1174 }
1175
test_identical_branches2(bool b)1176 void test_identical_branches2(bool b) {
1177 int i = 0;
1178 if (b) { // expected-warning {{true and false branches are identical}}
1179 ++i;
1180 } else
1181 ++i;
1182 }
1183
test_identical_branches3(bool b)1184 void test_identical_branches3(bool b) {
1185 int i = 0;
1186 if (b) { // no warning
1187 ++i;
1188 } else {
1189 i++;
1190 }
1191 }
1192
test_identical_branches4(bool b)1193 void test_identical_branches4(bool b) {
1194 int i = 0;
1195 if (b) { // expected-warning {{true and false branches are identical}}
1196 } else {
1197 }
1198 }
1199
test_identical_branches_break(bool b)1200 void test_identical_branches_break(bool b) {
1201 while (true) {
1202 if (b) // expected-warning {{true and false branches are identical}}
1203 break;
1204 else
1205 break;
1206 }
1207 }
1208
test_identical_branches_continue(bool b)1209 void test_identical_branches_continue(bool b) {
1210 while (true) {
1211 if (b) // expected-warning {{true and false branches are identical}}
1212 continue;
1213 else
1214 continue;
1215 }
1216 }
1217
test_identical_branches_func(bool b)1218 void test_identical_branches_func(bool b) {
1219 if (b) // expected-warning {{true and false branches are identical}}
1220 func();
1221 else
1222 func();
1223 }
1224
test_identical_branches_func_arguments(bool b)1225 void test_identical_branches_func_arguments(bool b) {
1226 if (b) // no-warning
1227 funcParam(1);
1228 else
1229 funcParam(2);
1230 }
1231
test_identical_branches_cast1(bool b)1232 void test_identical_branches_cast1(bool b) {
1233 long v = -7;
1234 if (b) // no-warning
1235 v = (signed int) v;
1236 else
1237 v = (unsigned int) v;
1238 }
1239
test_identical_branches_cast2(bool b)1240 void test_identical_branches_cast2(bool b) {
1241 long v = -7;
1242 if (b) // expected-warning {{true and false branches are identical}}
1243 v = (signed int) v;
1244 else
1245 v = (signed int) v;
1246 }
1247
test_identical_branches_return_int(bool b)1248 int test_identical_branches_return_int(bool b) {
1249 int i = 0;
1250 if (b) { // expected-warning {{true and false branches are identical}}
1251 i++;
1252 return i;
1253 } else {
1254 i++;
1255 return i;
1256 }
1257 }
1258
test_identical_branches_return_func(bool b)1259 int test_identical_branches_return_func(bool b) {
1260 if (b) { // expected-warning {{true and false branches are identical}}
1261 return func();
1262 } else {
1263 return func();
1264 }
1265 }
1266
test_identical_branches_for(bool b)1267 void test_identical_branches_for(bool b) {
1268 int i;
1269 int j;
1270 if (b) { // expected-warning {{true and false branches are identical}}
1271 for (i = 0, j = 0; i < 10; i++)
1272 j += 4;
1273 } else {
1274 for (i = 0, j = 0; i < 10; i++)
1275 j += 4;
1276 }
1277 }
1278
test_identical_branches_while(bool b)1279 void test_identical_branches_while(bool b) {
1280 int i = 10;
1281 if (b) { // expected-warning {{true and false branches are identical}}
1282 while (func())
1283 i--;
1284 } else {
1285 while (func())
1286 i--;
1287 }
1288 }
1289
test_identical_branches_while_2(bool b)1290 void test_identical_branches_while_2(bool b) {
1291 int i = 10;
1292 if (b) { // no-warning
1293 while (func())
1294 i--;
1295 } else {
1296 while (func())
1297 i++;
1298 }
1299 }
1300
test_identical_branches_do_while(bool b)1301 void test_identical_branches_do_while(bool b) {
1302 int i = 10;
1303 if (b) { // expected-warning {{true and false branches are identical}}
1304 do {
1305 i--;
1306 } while (func());
1307 } else {
1308 do {
1309 i--;
1310 } while (func());
1311 }
1312 }
1313
test_identical_branches_if(bool b,int i)1314 void test_identical_branches_if(bool b, int i) {
1315 if (b) { // expected-warning {{true and false branches are identical}}
1316 if (i < 5)
1317 i += 10;
1318 } else {
1319 if (i < 5)
1320 i += 10;
1321 }
1322 }
1323
test_identical_bitwise1()1324 void test_identical_bitwise1() {
1325 int a = 5 | 5; // expected-warning {{identical expressions on both sides of bitwise operator}}
1326 }
1327
test_identical_bitwise2()1328 void test_identical_bitwise2() {
1329 int a = 5;
1330 int b = a | a; // expected-warning {{identical expressions on both sides of bitwise operator}}
1331 }
1332
test_identical_bitwise3()1333 void test_identical_bitwise3() {
1334 int a = 5;
1335 int b = (a | a); // expected-warning {{identical expressions on both sides of bitwise operator}}
1336 }
1337
test_identical_bitwise4()1338 void test_identical_bitwise4() {
1339 int a = 4;
1340 int b = a | 4; // no-warning
1341 }
1342
test_identical_bitwise5()1343 void test_identical_bitwise5() {
1344 int a = 4;
1345 int b = 4;
1346 int c = a | b; // no-warning
1347 }
1348
test_identical_bitwise6()1349 void test_identical_bitwise6() {
1350 int a = 5;
1351 int b = a | 4 | a; // expected-warning {{identical expressions on both sides of bitwise operator}}
1352 }
1353
test_identical_bitwise7()1354 void test_identical_bitwise7() {
1355 int a = 5;
1356 int b = func() | func(); // no-warning
1357 }
1358
test_identical_logical1(int a)1359 void test_identical_logical1(int a) {
1360 if (a == 4 && a == 4) // expected-warning {{identical expressions on both sides of logical operator}}
1361 ;
1362 }
1363
test_identical_logical2(int a)1364 void test_identical_logical2(int a) {
1365 if (a == 4 || a == 5 || a == 4) // expected-warning {{identical expressions on both sides of logical operator}}
1366 ;
1367 }
1368
test_identical_logical3(int a)1369 void test_identical_logical3(int a) {
1370 if (a == 4 || a == 5 || a == 6) // no-warning
1371 ;
1372 }
1373
test_identical_logical4(int a)1374 void test_identical_logical4(int a) {
1375 if (a == func() || a == func()) // no-warning
1376 ;
1377 }
1378
1379 #pragma clang diagnostic push
1380 #pragma clang diagnostic ignored "-Wlogical-op-parentheses"
test_identical_logical5(int x,int y)1381 void test_identical_logical5(int x, int y) {
1382 if (x == 4 && y == 5 || x == 4 && y == 6) // no-warning
1383 ;
1384 }
1385
test_identical_logical6(int x,int y)1386 void test_identical_logical6(int x, int y) {
1387 if (x == 4 && y == 5 || x == 4 && y == 5) // expected-warning {{identical expressions on both sides of logical operator}}
1388 ;
1389 }
1390
test_identical_logical7(int x,int y)1391 void test_identical_logical7(int x, int y) {
1392 // FIXME: We should warn here
1393 if (x == 4 && y == 5 || x == 4)
1394 ;
1395 }
1396
test_identical_logical8(int x,int y)1397 void test_identical_logical8(int x, int y) {
1398 // FIXME: We should warn here
1399 if (x == 4 || y == 5 && x == 4)
1400 ;
1401 }
1402
test_identical_logical9(int x,int y)1403 void test_identical_logical9(int x, int y) {
1404 // FIXME: We should warn here
1405 if (x == 4 || x == 4 && y == 5)
1406 ;
1407 }
1408 #pragma clang diagnostic pop
1409
test_warn_chained_if_stmts_1(int x)1410 void test_warn_chained_if_stmts_1(int x) {
1411 if (x == 1)
1412 ;
1413 else if (x == 1) // expected-warning {{expression is identical to previous condition}}
1414 ;
1415 }
1416
test_warn_chained_if_stmts_2(int x)1417 void test_warn_chained_if_stmts_2(int x) {
1418 if (x == 1)
1419 ;
1420 else if (x == 1) // expected-warning {{expression is identical to previous condition}}
1421 ;
1422 else if (x == 1) // expected-warning {{expression is identical to previous condition}}
1423 ;
1424 }
1425
test_warn_chained_if_stmts_3(int x)1426 void test_warn_chained_if_stmts_3(int x) {
1427 if (x == 1)
1428 ;
1429 else if (x == 2)
1430 ;
1431 else if (x == 1) // expected-warning {{expression is identical to previous condition}}
1432 ;
1433 }
1434
test_warn_chained_if_stmts_4(int x)1435 void test_warn_chained_if_stmts_4(int x) {
1436 if (x == 1)
1437 ;
1438 else if (func())
1439 ;
1440 else if (x == 1) // expected-warning {{expression is identical to previous condition}}
1441 ;
1442 }
1443
test_warn_chained_if_stmts_5(int x)1444 void test_warn_chained_if_stmts_5(int x) {
1445 if (x & 1)
1446 ;
1447 else if (x & 1) // expected-warning {{expression is identical to previous condition}}
1448 ;
1449 }
1450
test_warn_chained_if_stmts_6(int x)1451 void test_warn_chained_if_stmts_6(int x) {
1452 if (x == 1)
1453 ;
1454 else if (x == 2)
1455 ;
1456 else if (x == 2) // expected-warning {{expression is identical to previous condition}}
1457 ;
1458 else if (x == 3)
1459 ;
1460 }
1461
test_warn_chained_if_stmts_7(int x)1462 void test_warn_chained_if_stmts_7(int x) {
1463 if (x == 1)
1464 ;
1465 else if (x == 2)
1466 ;
1467 else if (x == 3)
1468 ;
1469 else if (x == 2) // expected-warning {{expression is identical to previous condition}}
1470 ;
1471 else if (x == 5)
1472 ;
1473 }
1474
test_warn_chained_if_stmts_8(int x)1475 void test_warn_chained_if_stmts_8(int x) {
1476 if (x == 1)
1477 ;
1478 else if (x == 2)
1479 ;
1480 else if (x == 3)
1481 ;
1482 else if (x == 2) // expected-warning {{expression is identical to previous condition}}
1483 ;
1484 else if (x == 5)
1485 ;
1486 else if (x == 3) // expected-warning {{expression is identical to previous condition}}
1487 ;
1488 else if (x == 7)
1489 ;
1490 }
1491
test_nowarn_chained_if_stmts_1(int x)1492 void test_nowarn_chained_if_stmts_1(int x) {
1493 if (func())
1494 ;
1495 else if (func()) // no-warning
1496 ;
1497 }
1498
test_nowarn_chained_if_stmts_2(int x)1499 void test_nowarn_chained_if_stmts_2(int x) {
1500 if (func())
1501 ;
1502 else if (x == 1)
1503 ;
1504 else if (func()) // no-warning
1505 ;
1506 }
1507
test_nowarn_chained_if_stmts_3(int x)1508 void test_nowarn_chained_if_stmts_3(int x) {
1509 if (x++)
1510 ;
1511 else if (x++) // no-warning
1512 ;
1513 }
1514
test_warn_wchar()1515 void test_warn_wchar() {
1516 const wchar_t * a = 0 ? L"Warning" : L"Warning"; // expected-warning {{identical expressions on both sides of ':' in conditional expression}}
1517 }
test_nowarn_wchar()1518 void test_nowarn_wchar() {
1519 const wchar_t * a = 0 ? L"No" : L"Warning";
1520 }
1521
test_nowarn_long()1522 void test_nowarn_long() {
1523 int a = 0, b = 0;
1524 long c;
1525 if (0) {
1526 b -= a;
1527 c = 0;
1528 } else { // no-warning
1529 b -= a;
1530 c = 0LL;
1531 }
1532 }
1533
1534 // Identical inner conditions
1535
test_warn_inner_if_1(int x)1536 void test_warn_inner_if_1(int x) {
1537 if (x == 1) {
1538 if (x == 1) // expected-warning {{conditions of the inner and outer statements are identical}}
1539 ;
1540 }
1541
1542 // FIXME: Should warn here. The warning is currently not emitted because there
1543 // is code between the conditions.
1544 if (x == 1) {
1545 int y = x;
1546 if (x == 1)
1547 ;
1548 }
1549 }
1550
test_nowarn_inner_if_1(int x)1551 void test_nowarn_inner_if_1(int x) {
1552 // Don't warn when condition has side effects.
1553 if (x++ == 1) {
1554 if (x++ == 1)
1555 ;
1556 }
1557
1558 // Don't warn when x is changed before inner condition.
1559 if (x < 10) {
1560 x++;
1561 if (x < 10)
1562 ;
1563 }
1564 }
1565