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