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 | |
5 | int func(void) |
6 | { |
7 | return 0; |
8 | } |
9 | |
10 | int func2(void) |
11 | { |
12 | return 0; |
13 | } |
14 | |
15 | int funcParam(int a) |
16 | { |
17 | return 0; |
18 | } |
19 | |
20 | /* '!=' operator*/ |
21 | |
22 | /* '!=' with float */ |
23 | int checkNotEqualFloatLiteralCompare1(void) { |
24 | return (5.14F != 5.14F); // no warning |
25 | } |
26 | |
27 | int checkNotEqualFloatLiteralCompare2(void) { |
28 | return (6.14F != 7.14F); // no warning |
29 | } |
30 | |
31 | int checkNotEqualFloatDeclCompare1(void) { |
32 | float f = 7.1F; |
33 | float g = 7.1F; |
34 | return (f != g); // no warning |
35 | } |
36 | |
37 | int checkNotEqualFloatDeclCompare12(void) { |
38 | float f = 7.1F; |
39 | return (f != f); // no warning |
40 | } |
41 | |
42 | int checkNotEqualFloatDeclCompare3(void) { |
43 | float f = 7.1F; |
44 | return (f != 7.1F); // no warning |
45 | } |
46 | |
47 | int checkNotEqualFloatDeclCompare4(void) { |
48 | float f = 7.1F; |
49 | return (7.1F != f); // no warning |
50 | } |
51 | |
52 | int checkNotEqualFloatDeclCompare5(void) { |
53 | float f = 7.1F; |
54 | int t = 7; |
55 | return (t != f); // no warning |
56 | } |
57 | |
58 | int checkNotEqualFloatDeclCompare6(void) { |
59 | float f = 7.1F; |
60 | int t = 7; |
61 | return (f != t); // no warning |
62 | } |
63 | |
64 | |
65 | |
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 | } |
70 | int checkNotEqualCastFloatDeclCompare12(void) { |
71 | float f = 7.1F; |
72 | return ((char)f != (int)f); // no warning |
73 | } |
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 | } |
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 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
132 | int checkNotEqualIntLiteralCompare1(void) { |
133 | return (5 != 5); // expected-warning {{comparison of identical expressions always evaluates to false}} |
134 | } |
135 | |
136 | int checkNotEqualIntLiteralCompare2(void) { |
137 | return (6 != 7); // no warning |
138 | } |
139 | |
140 | int checkNotEqualIntDeclCompare1(void) { |
141 | int f = 7; |
142 | int g = 7; |
143 | return (f != g); // no warning |
144 | } |
145 | |
146 | int checkNotEqualIntDeclCompare3(void) { |
147 | int f = 7; |
148 | return (f != 7); // no warning |
149 | } |
150 | |
151 | int checkNotEqualIntDeclCompare4(void) { |
152 | int f = 7; |
153 | return (7 != f); // no warning |
154 | } |
155 | |
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 | } |
160 | int checkNotEqualCastIntDeclCompare12(void) { |
161 | int f = 7; |
162 | return ((char)f != (int)f); // no warning |
163 | } |
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 | } |
172 | int checkNotEqualBinaryOpIntCompare2(void) { |
173 | int f = 7; |
174 | int g = 7; |
175 | return (f + 4 != g + 4); // no warning |
176 | } |
177 | |
178 | |
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 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
236 | int checkNotEqualIntPointerLiteralCompare1(void) { |
237 | int* p = 0; |
238 | return (p != 0); // no warning |
239 | } |
240 | |
241 | int checkNotEqualIntPointerLiteralCompare2(void) { |
242 | return (6 != 7); // no warning |
243 | } |
244 | |
245 | int checkNotEqualIntPointerDeclCompare1(void) { |
246 | int k = 3; |
247 | int* f = &k; |
248 | int* g = &k; |
249 | return (f != g); // no warning |
250 | } |
251 | |
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 | } |
257 | int checkNotEqualCastIntPointerDeclCompare12(void) { |
258 | int k = 7; |
259 | int* f = &k; |
260 | return ((int*)((char*)f) != (int*)f); // no warning |
261 | } |
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 | } |
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 | |
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 | } |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
351 | int checkEqualIntPointerDeclCompare(void) { |
352 | int k = 3; |
353 | int* f = &k; |
354 | int* g = &k; |
355 | return (f == g); // no warning |
356 | } |
357 | |
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 | |
366 | int checkEqualFloatLiteralCompare1(void) { |
367 | return (5.14F == 5.14F); // no warning |
368 | } |
369 | |
370 | int checkEqualFloatLiteralCompare2(void) { |
371 | return (6.14F == 7.14F); // no warning |
372 | } |
373 | |
374 | int checkEqualFloatDeclCompare1(void) { |
375 | float f = 7.1F; |
376 | float g = 7.1F; |
377 | return (f == g); // no warning |
378 | } |
379 | |
380 | int checkEqualFloatDeclCompare12(void) { |
381 | float f = 7.1F; |
382 | return (f == f); // no warning |
383 | } |
384 | |
385 | |
386 | int checkEqualFloatDeclCompare3(void) { |
387 | float f = 7.1F; |
388 | return (f == 7.1F); // no warning |
389 | } |
390 | |
391 | int checkEqualFloatDeclCompare4(void) { |
392 | float f = 7.1F; |
393 | return (7.1F == f); // no warning |
394 | } |
395 | |
396 | int checkEqualFloatDeclCompare5(void) { |
397 | float f = 7.1F; |
398 | int t = 7; |
399 | return (t == f); // no warning |
400 | } |
401 | |
402 | int checkEqualFloatDeclCompare6(void) { |
403 | float f = 7.1F; |
404 | int t = 7; |
405 | return (f == t); // no warning |
406 | } |
407 | |
408 | |
409 | |
410 | |
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 | } |
415 | int checkEqualCastFloatDeclCompare12(void) { |
416 | float f = 7.1F; |
417 | return ((char)f == (int)f); // no warning |
418 | } |
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 | } |
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 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
476 | int checkEqualIntLiteralCompare1(void) { |
477 | return (5 == 5); // expected-warning {{comparison of identical expressions always evaluates to true}} |
478 | } |
479 | |
480 | int checkEqualIntLiteralCompare2(void) { |
481 | return (6 == 7); // no warning |
482 | } |
483 | |
484 | int checkEqualIntDeclCompare1(void) { |
485 | int f = 7; |
486 | int g = 7; |
487 | return (f == g); // no warning |
488 | } |
489 | |
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 | } |
494 | int checkEqualCastIntDeclCompare12(void) { |
495 | int f = 7; |
496 | return ((char)f == (int)f); // no warning |
497 | } |
498 | |
499 | int checkEqualIntDeclCompare3(void) { |
500 | int f = 7; |
501 | return (f == 7); // no warning |
502 | } |
503 | |
504 | int checkEqualIntDeclCompare4(void) { |
505 | int f = 7; |
506 | return (7 == f); // no warning |
507 | } |
508 | |
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 | } |
517 | int checkEqualBinaryOpIntCompare2(void) { |
518 | int f = 7; |
519 | int g = 7; |
520 | return (f + 4 == g + 4); // no warning |
521 | } |
522 | |
523 | |
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 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
617 | int checkLessThanFloatLiteralCompare1(void) { |
618 | return (5.14F < 5.14F); // expected-warning {{comparison of identical expressions always evaluates to false}} |
619 | } |
620 | |
621 | int checkLessThanFloatLiteralCompare2(void) { |
622 | return (6.14F < 7.14F); // no warning |
623 | } |
624 | |
625 | int checkLessThanFloatDeclCompare1(void) { |
626 | float f = 7.1F; |
627 | float g = 7.1F; |
628 | return (f < g); // no warning |
629 | } |
630 | |
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 | |
636 | int checkLessThanFloatDeclCompare3(void) { |
637 | float f = 7.1F; |
638 | return (f < 7.1F); // no warning |
639 | } |
640 | |
641 | int checkLessThanFloatDeclCompare4(void) { |
642 | float f = 7.1F; |
643 | return (7.1F < f); // no warning |
644 | } |
645 | |
646 | int checkLessThanFloatDeclCompare5(void) { |
647 | float f = 7.1F; |
648 | int t = 7; |
649 | return (t < f); // no warning |
650 | } |
651 | |
652 | int checkLessThanFloatDeclCompare6(void) { |
653 | float f = 7.1F; |
654 | int t = 7; |
655 | return (f < t); // no warning |
656 | } |
657 | |
658 | |
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 | } |
663 | int checkLessThanCastFloatDeclCompare12(void) { |
664 | float f = 7.1F; |
665 | return ((char)f < (int)f); // no warning |
666 | } |
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 | } |
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 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
723 | int checkLessThanIntLiteralCompare1(void) { |
724 | return (5 < 5); // expected-warning {{comparison of identical expressions always evaluates to false}} |
725 | } |
726 | |
727 | int checkLessThanIntLiteralCompare2(void) { |
728 | return (6 < 7); // no warning |
729 | } |
730 | |
731 | int checkLessThanIntDeclCompare1(void) { |
732 | int f = 7; |
733 | int g = 7; |
734 | return (f < g); // no warning |
735 | } |
736 | |
737 | int checkLessThanIntDeclCompare3(void) { |
738 | int f = 7; |
739 | return (f < 7); // no warning |
740 | } |
741 | |
742 | int checkLessThanIntDeclCompare4(void) { |
743 | int f = 7; |
744 | return (7 < f); // no warning |
745 | } |
746 | |
747 | int checkLessThanIntDeclCompare5(void) { |
748 | int f = 7; |
749 | int t = 7; |
750 | return (t < f); // no warning |
751 | } |
752 | |
753 | int checkLessThanIntDeclCompare6(void) { |
754 | int f = 7; |
755 | int t = 7; |
756 | return (f < t); // no warning |
757 | } |
758 | |
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 | } |
763 | int checkLessThanCastIntDeclCompare12(void) { |
764 | int f = 7; |
765 | return ((char)f < (int)f); // no warning |
766 | } |
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 | } |
773 | int checkLessThanBinaryOpIntCompare2(void) { |
774 | int f = 7; |
775 | int g = 7; |
776 | return (f + 3 < g + 3); // no warning |
777 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
827 | int checkGreaterThanFloatLiteralCompare1(void) { |
828 | return (5.14F > 5.14F); // expected-warning {{comparison of identical expressions always evaluates to false}} |
829 | } |
830 | |
831 | int checkGreaterThanFloatLiteralCompare2(void) { |
832 | return (6.14F > 7.14F); // no warning |
833 | } |
834 | |
835 | int checkGreaterThanFloatDeclCompare1(void) { |
836 | float f = 7.1F; |
837 | float g = 7.1F; |
838 | |
839 | return (f > g); // no warning |
840 | } |
841 | |
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 | |
848 | int checkGreaterThanFloatDeclCompare3(void) { |
849 | float f = 7.1F; |
850 | return (f > 7.1F); // no warning |
851 | } |
852 | |
853 | int checkGreaterThanFloatDeclCompare4(void) { |
854 | float f = 7.1F; |
855 | return (7.1F > f); // no warning |
856 | } |
857 | |
858 | int checkGreaterThanFloatDeclCompare5(void) { |
859 | float f = 7.1F; |
860 | int t = 7; |
861 | return (t > f); // no warning |
862 | } |
863 | |
864 | int checkGreaterThanFloatDeclCompare6(void) { |
865 | float f = 7.1F; |
866 | int t = 7; |
867 | return (f > t); // no warning |
868 | } |
869 | |
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 | } |
874 | int checkGreaterThanCastFloatDeclCompare12(void) { |
875 | float f = 7.1F; |
876 | return ((char)f > (int)f); // no warning |
877 | } |
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 | } |
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 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
934 | int checkGreaterThanIntLiteralCompare1(void) { |
935 | return (5 > 5); // expected-warning {{comparison of identical expressions always evaluates to false}} |
936 | } |
937 | |
938 | int checkGreaterThanIntLiteralCompare2(void) { |
939 | return (6 > 7); // no warning |
940 | } |
941 | |
942 | int checkGreaterThanIntDeclCompare1(void) { |
943 | int f = 7; |
944 | int g = 7; |
945 | |
946 | return (f > g); // no warning |
947 | } |
948 | |
949 | int checkGreaterThanIntDeclCompare3(void) { |
950 | int f = 7; |
951 | return (f > 7); // no warning |
952 | } |
953 | |
954 | int checkGreaterThanIntDeclCompare4(void) { |
955 | int f = 7; |
956 | return (7 > f); // no warning |
957 | } |
958 | |
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 | } |
963 | int checkGreaterThanCastIntDeclCompare12(void) { |
964 | int f = 7; |
965 | return ((char)f > (int)f); // no warning |
966 | } |
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 | } |
973 | int checkGreaterThanBinaryOpIntCompare2(void) { |
974 | int f = 7; |
975 | int g = 7; |
976 | return (f + 3 > g + 3); // no warning |
977 | } |
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 | } |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
1080 | void test_bool_expr_negative(bool a) { |
1081 | bool b = 0; |
1082 | a = a > 0 ? a&&b : b&&a; // no warning |
1083 | } |
1084 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
1121 | void test_expr_negative_inc() { |
1122 | unsigned a = 0; |
1123 | unsigned b = 1; |
1124 | a = a > 5 ? a++ : b++; // no warning |
1125 | } |
1126 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
1225 | void test_identical_branches_func_arguments(bool b) { |
1226 | if (b) // no-warning |
1227 | funcParam(1); |
1228 | else |
1229 | funcParam(2); |
1230 | } |
1231 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
1324 | void test_identical_bitwise1() { |
1325 | int a = 5 | 5; // expected-warning {{identical expressions on both sides of bitwise operator}} |
1326 | } |
1327 | |
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 | |
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 | |
1338 | void test_identical_bitwise4() { |
1339 | int a = 4; |
1340 | int b = a | 4; // no-warning |
1341 | } |
1342 | |
1343 | void test_identical_bitwise5() { |
1344 | int a = 4; |
1345 | int b = 4; |
1346 | int c = a | b; // no-warning |
1347 | } |
1348 | |
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 | |
1354 | void test_identical_bitwise7() { |
1355 | int a = 5; |
1356 | int b = func() | func(); // no-warning |
1357 | } |
1358 | |
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 | |
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 | |
1369 | void test_identical_logical3(int a) { |
1370 | if (a == 4 || a == 5 || a == 6) // no-warning |
1371 | ; |
1372 | } |
1373 | |
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" |
1381 | void test_identical_logical5(int x, int y) { |
1382 | if (x == 4 && y == 5 || x == 4 && y == 6) // no-warning |
1383 | ; |
1384 | } |
1385 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
1492 | void test_nowarn_chained_if_stmts_1(int x) { |
1493 | if (func()) |
1494 | ; |
1495 | else if (func()) // no-warning |
1496 | ; |
1497 | } |
1498 | |
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 | |
1508 | void test_nowarn_chained_if_stmts_3(int x) { |
1509 | if (x++) |
1510 | ; |
1511 | else if (x++) // no-warning |
1512 | ; |
1513 | } |
1514 | |
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 | } |
1518 | void test_nowarn_wchar() { |
1519 | const wchar_t * a = 0 ? L"No" : L"Warning"; |
1520 | } |
1521 | |
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 | |
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 | |
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 | |