1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -Wtautological-constant-in-range-compare %s -Wno-unreachable-code |
2 | |
3 | int test(char *C) { // nothing here should warn. |
4 | return C != ((void*)0); |
5 | return C != (void*)0; |
6 | return C != 0; |
7 | return C != 1; // expected-warning {{comparison between pointer and integer ('char *' and 'int')}} |
8 | } |
9 | |
10 | int ints(long a, unsigned long b) { |
11 | enum EnumA {A}; |
12 | enum EnumB {B}; |
13 | enum EnumC {C = 0x10000}; |
14 | return |
15 | // (a,b) |
16 | (a == (unsigned long) b) + // expected-warning {{comparison of integers of different signs}} |
17 | (a == (unsigned int) b) + |
18 | (a == (unsigned short) b) + |
19 | (a == (unsigned char) b) + |
20 | ((long) a == b) + // expected-warning {{comparison of integers of different signs}} |
21 | ((int) a == b) + // expected-warning {{comparison of integers of different signs}} |
22 | ((short) a == b) + // expected-warning {{comparison of integers of different signs}} |
23 | ((signed char) a == b) + // expected-warning {{comparison of integers of different signs}} |
24 | ((long) a == (unsigned long) b) + // expected-warning {{comparison of integers of different signs}} |
25 | ((int) a == (unsigned int) b) + // expected-warning {{comparison of integers of different signs}} |
26 | ((short) a == (unsigned short) b) + |
27 | ((signed char) a == (unsigned char) b) + |
28 | (a < (unsigned long) b) + // expected-warning {{comparison of integers of different signs}} |
29 | (a < (unsigned int) b) + |
30 | (a < (unsigned short) b) + |
31 | (a < (unsigned char) b) + |
32 | ((long) a < b) + // expected-warning {{comparison of integers of different signs}} |
33 | ((int) a < b) + // expected-warning {{comparison of integers of different signs}} |
34 | ((short) a < b) + // expected-warning {{comparison of integers of different signs}} |
35 | ((signed char) a < b) + // expected-warning {{comparison of integers of different signs}} |
36 | ((long) a < (unsigned long) b) + // expected-warning {{comparison of integers of different signs}} |
37 | ((int) a < (unsigned int) b) + // expected-warning {{comparison of integers of different signs}} |
38 | ((short) a < (unsigned short) b) + |
39 | ((signed char) a < (unsigned char) b) + |
40 | |
41 | // (A,b) |
42 | (A == (unsigned long) b) + |
43 | (A == (unsigned int) b) + |
44 | (A == (unsigned short) b) + |
45 | (A == (unsigned char) b) + |
46 | ((long) A == b) + |
47 | ((int) A == b) + |
48 | ((short) A == b) + |
49 | ((signed char) A == b) + |
50 | ((long) A == (unsigned long) b) + |
51 | ((int) A == (unsigned int) b) + |
52 | ((short) A == (unsigned short) b) + |
53 | ((signed char) A == (unsigned char) b) + |
54 | (A < (unsigned long) b) + |
55 | (A < (unsigned int) b) + |
56 | (A < (unsigned short) b) + |
57 | (A < (unsigned char) b) + |
58 | ((long) A < b) + |
59 | ((int) A < b) + |
60 | ((short) A < b) + |
61 | ((signed char) A < b) + |
62 | ((long) A < (unsigned long) b) + |
63 | ((int) A < (unsigned int) b) + |
64 | ((short) A < (unsigned short) b) + |
65 | ((signed char) A < (unsigned char) b) + |
66 | |
67 | // (a,B) |
68 | (a == (unsigned long) B) + |
69 | (a == (unsigned int) B) + |
70 | (a == (unsigned short) B) + |
71 | (a == (unsigned char) B) + |
72 | ((long) a == B) + |
73 | ((int) a == B) + |
74 | ((short) a == B) + |
75 | ((signed char) a == B) + |
76 | ((long) a == (unsigned long) B) + |
77 | ((int) a == (unsigned int) B) + |
78 | ((short) a == (unsigned short) B) + |
79 | ((signed char) a == (unsigned char) B) + |
80 | (a < (unsigned long) B) + // expected-warning {{comparison of unsigned expression < 0 is always false}} |
81 | (a < (unsigned int) B) + |
82 | (a < (unsigned short) B) + |
83 | (a < (unsigned char) B) + |
84 | ((long) a < B) + |
85 | ((int) a < B) + |
86 | ((short) a < B) + |
87 | ((signed char) a < B) + |
88 | ((long) a < (unsigned long) B) + // expected-warning {{comparison of unsigned expression < 0 is always false}} |
89 | ((int) a < (unsigned int) B) + // expected-warning {{comparison of unsigned expression < 0 is always false}} |
90 | ((short) a < (unsigned short) B) + |
91 | ((signed char) a < (unsigned char) B) + |
92 | |
93 | // (C,b) |
94 | (C == (unsigned long) b) + |
95 | (C == (unsigned int) b) + |
96 | (C == (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}} |
97 | (C == (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}} |
98 | ((long) C == b) + |
99 | ((int) C == b) + |
100 | ((short) C == b) + |
101 | ((signed char) C == b) + |
102 | ((long) C == (unsigned long) b) + |
103 | ((int) C == (unsigned int) b) + |
104 | ((short) C == (unsigned short) b) + |
105 | ((signed char) C == (unsigned char) b) + |
106 | (C < (unsigned long) b) + |
107 | (C < (unsigned int) b) + |
108 | (C < (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}} |
109 | (C < (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}} |
110 | ((long) C < b) + |
111 | ((int) C < b) + |
112 | ((short) C < b) + |
113 | ((signed char) C < b) + |
114 | ((long) C < (unsigned long) b) + |
115 | ((int) C < (unsigned int) b) + |
116 | ((short) C < (unsigned short) b) + |
117 | ((signed char) C < (unsigned char) b) + |
118 | |
119 | // (a,C) |
120 | (a == (unsigned long) C) + |
121 | (a == (unsigned int) C) + |
122 | (a == (unsigned short) C) + |
123 | (a == (unsigned char) C) + |
124 | ((long) a == C) + |
125 | ((int) a == C) + |
126 | ((short) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always false}} |
127 | ((signed char) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always false}} |
128 | ((long) a == (unsigned long) C) + |
129 | ((int) a == (unsigned int) C) + |
130 | ((short) a == (unsigned short) C) + |
131 | ((signed char) a == (unsigned char) C) + |
132 | (a < (unsigned long) C) + // expected-warning {{comparison of integers of different signs}} |
133 | (a < (unsigned int) C) + |
134 | (a < (unsigned short) C) + |
135 | (a < (unsigned char) C) + |
136 | ((long) a < C) + |
137 | ((int) a < C) + |
138 | ((short) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always true}} |
139 | ((signed char) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always true}} |
140 | ((long) a < (unsigned long) C) + // expected-warning {{comparison of integers of different signs}} |
141 | ((int) a < (unsigned int) C) + // expected-warning {{comparison of integers of different signs}} |
142 | ((short) a < (unsigned short) C) + |
143 | ((signed char) a < (unsigned char) C) + |
144 | |
145 | // (0x80000,b) |
146 | (0x80000 == (unsigned long) b) + |
147 | (0x80000 == (unsigned int) b) + |
148 | (0x80000 == (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}} |
149 | (0x80000 == (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}} |
150 | ((long) 0x80000 == b) + |
151 | ((int) 0x80000 == b) + |
152 | ((short) 0x80000 == b) + |
153 | ((signed char) 0x80000 == b) + |
154 | ((long) 0x80000 == (unsigned long) b) + |
155 | ((int) 0x80000 == (unsigned int) b) + |
156 | ((short) 0x80000 == (unsigned short) b) + |
157 | ((signed char) 0x80000 == (unsigned char) b) + |
158 | (0x80000 < (unsigned long) b) + |
159 | (0x80000 < (unsigned int) b) + |
160 | (0x80000 < (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}} |
161 | (0x80000 < (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}} |
162 | ((long) 0x80000 < b) + |
163 | ((int) 0x80000 < b) + |
164 | ((short) 0x80000 < b) + |
165 | ((signed char) 0x80000 < b) + |
166 | ((long) 0x80000 < (unsigned long) b) + |
167 | ((int) 0x80000 < (unsigned int) b) + |
168 | ((short) 0x80000 < (unsigned short) b) + |
169 | ((signed char) 0x80000 < (unsigned char) b) + |
170 | |
171 | // (a,0x80000) |
172 | (a == (unsigned long) 0x80000) + |
173 | (a == (unsigned int) 0x80000) + |
174 | (a == (unsigned short) 0x80000) + |
175 | (a == (unsigned char) 0x80000) + |
176 | ((long) a == 0x80000) + |
177 | ((int) a == 0x80000) + |
178 | ((short) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always false}} |
179 | ((signed char) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always false}} |
180 | ((long) a == (unsigned long) 0x80000) + |
181 | ((int) a == (unsigned int) 0x80000) + |
182 | ((short) a == (unsigned short) 0x80000) + |
183 | ((signed char) a == (unsigned char) 0x80000) + |
184 | (a < (unsigned long) 0x80000) + // expected-warning {{comparison of integers of different signs}} |
185 | (a < (unsigned int) 0x80000) + |
186 | (a < (unsigned short) 0x80000) + |
187 | (a < (unsigned char) 0x80000) + |
188 | ((long) a < 0x80000) + |
189 | ((int) a < 0x80000) + |
190 | ((short) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always true}} |
191 | ((signed char) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always true}} |
192 | ((long) a < (unsigned long) 0x80000) + // expected-warning {{comparison of integers of different signs}} |
193 | ((int) a < (unsigned int) 0x80000) + // expected-warning {{comparison of integers of different signs}} |
194 | ((short) a < (unsigned short) 0x80000) + |
195 | ((signed char) a < (unsigned char) 0x80000) + |
196 | |
197 | // We should be able to avoid warning about this. |
198 | (b != (a < 4 ? 1 : 2)) + |
199 | |
200 | 10 |
201 | ; |
202 | } |
203 | |
204 | int equal(char *a, const char *b) { |
205 | return a == b; |
206 | } |
207 | |
208 | int arrays(char (*a)[5], char(*b)[10], char(*c)[5]) { |
209 | int d = (a == c); |
210 | return a == b; // expected-warning {{comparison of distinct pointer types}} |
211 | } |
212 | |
213 | int pointers(int *a) { |
214 | return a > 0; // expected-warning {{ordered comparison between pointer and zero ('int *' and 'int') is an extension}} |
215 | return a > 42; // expected-warning {{ordered comparison between pointer and integer ('int *' and 'int')}} |
216 | return a > (void *)0; // expected-warning {{comparison of distinct pointer types}} |
217 | } |
218 | |
219 | int function_pointers(int (*a)(int), int (*b)(int), void (*c)(int)) { |
220 | return a > b; // expected-warning {{ordered comparison of function pointers}} |
221 | return function_pointers > function_pointers; // expected-warning {{self-comparison always evaluates to false}} expected-warning{{ordered comparison of function pointers}} |
222 | return a > c; // expected-warning {{comparison of distinct pointer types}} |
223 | return a == (void *) 0; |
224 | return a == (void *) 1; // expected-warning {{equality comparison between function pointer and void pointer}} |
225 | } |
226 | |
227 | int void_pointers(void* foo) { |
228 | return foo == (void*) 0; |
229 | return foo == (void*) 1; |
230 | } |
231 | |
232 | |
233 | int test1(int i) { |
234 | enum en { zero }; |
235 | return i > zero; |
236 | } |
237 | |
238 | // PR5937 |
239 | int test2(int i32) { |
240 | struct foo { |
241 | unsigned int u8 : 8; |
242 | unsigned long long u31 : 31; |
243 | unsigned long long u32 : 32; |
244 | unsigned long long u63 : 63; |
245 | unsigned long long u64 : 64; |
246 | } *x; |
247 | |
248 | if (x->u8 == i32) { // comparison in int32, exact |
249 | return 0; |
250 | } else if (x->u31 == i32) { // comparison in int32, exact |
251 | return 1; |
252 | } else if (x->u32 == i32) { // expected-warning {{comparison of integers of different signs}} |
253 | return 2; |
254 | } else if (x->u63 == i32) { // comparison in uint64, exact because == |
255 | return 3; |
256 | } else if (x->u64 == i32) { // expected-warning {{comparison of integers of different signs}} |
257 | return 4; |
258 | } else { |
259 | return 5; |
260 | } |
261 | } |
262 | |
263 | // PR5887 |
264 | void test3() { |
265 | unsigned short x, y; |
266 | unsigned int z; |
267 | if ((x > y ? x : y) > z) |
268 | (void) 0; |
269 | } |
270 | |
271 | // PR5961 |
272 | extern char *ptr4; |
273 | void test4() { |
274 | long value; |
275 | if (value < (unsigned long) &ptr4) // expected-warning {{comparison of integers of different signs}} |
276 | return; |
277 | } |
278 | |
279 | // PR4807 |
280 | int test5(unsigned int x) { |
281 | return (x < 0) // expected-warning {{comparison of unsigned expression < 0 is always false}} |
282 | && (0 > x) // expected-warning {{comparison of 0 > unsigned expression is always false}} |
283 | && (x >= 0) // expected-warning {{comparison of unsigned expression >= 0 is always true}} |
284 | && (0 <= x); // expected-warning {{comparison of 0 <= unsigned expression is always true}} |
285 | } |
286 | |
287 | int test6(unsigned i, unsigned power) { |
288 | unsigned x = (i < (1 << power) ? i : 0); |
289 | return x != 3 ? 1 << power : i; |
290 | } |
291 | |
292 | // <rdar://problem/8414119> enum >= (enum)0 comparison should not generate any warnings |
293 | enum rdar8414119_Vals { X, Y, Z }; |
294 | #define ZERO 0 |
295 | #define CHECK(x) (x >= X) |
296 | void rdar8414119_foo(enum rdar8414119_Vals v) { |
297 | if (CHECK(v)) // no-warning |
298 | return; |
299 | if (v >= X) // no-warning |
300 | return; |
301 | } |
302 | int rdar8414119_bar(unsigned x) { |
303 | return x >= ZERO; // no-warning |
304 | } |
305 | #undef ZERO |
306 | #undef CHECK |
307 | |
308 | int rdar8511238() { |
309 | enum A { A_foo, A_bar }; |
310 | enum A a; |
311 | |
312 | if (a == 0) |
313 | return 0; |
314 | if (a != 0) |
315 | return 0; |
316 | if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}} |
317 | return 0; |
318 | if (a <= 0) |
319 | return 0; |
320 | if (a > 0) |
321 | return 0; |
322 | if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}} |
323 | return 0; |
324 | |
325 | if (0 == a) |
326 | return 0; |
327 | if (0 != a) |
328 | return 0; |
329 | if (0 < a) |
330 | return 0; |
331 | if (0 <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}} |
332 | return 0; |
333 | if (0 > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}} |
334 | return 0; |
335 | if (0 >= a) |
336 | return 0; |
337 | |
338 | if (a == 0U) |
339 | return 0; |
340 | if (a != 0U) |
341 | return 0; |
342 | if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}} |
343 | return 0; |
344 | if (a <= 0U) |
345 | return 0; |
346 | if (a > 0U) |
347 | return 0; |
348 | if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}} |
349 | return 0; |
350 | |
351 | if (0U == a) |
352 | return 0; |
353 | if (0U != a) |
354 | return 0; |
355 | if (0U < a) |
356 | return 0; |
357 | if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}} |
358 | return 0; |
359 | if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}} |
360 | return 0; |
361 | if (0U >= a) |
362 | return 0; |
363 | |
364 | return 20; |
365 | } |
366 | |
367 | // PR10336 |
368 | int test9(int sv, unsigned uv, long slv) { |
369 | return sv == (uv ^= slv); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}} |
370 | } |
371 | |
372 | void test10(void) { |
373 | int si; |
374 | unsigned int ui; |
375 | long sl; |
376 | |
377 | _Bool b; |
378 | b = (si == (ui = sl)); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}} |
379 | b = (si == (ui = sl&15)); |
380 | } |
381 | |
382 | // PR11572 |
383 | struct test11S { unsigned x : 30; }; |
384 | int test11(unsigned y, struct test11S *p) { |
385 | return y > (p->x >> 24); // no-warning |
386 | } |
387 | |
388 | typedef char one_char[1]; |
389 | typedef char two_chars[2]; |
390 | |
391 | void test12(unsigned a) { |
392 | if (0 && -1 > a) { } |
393 | } |
394 | |
395 | // PR36008 |
396 | |
397 | enum PR36008EnumTest { |
398 | kPR36008Value = 0, |
399 | }; |
400 | |
401 | void pr36008(enum PR36008EnumTest lhs) { |
402 | __typeof__(lhs) x = lhs; |
403 | __typeof__(kPR36008Value) y = (kPR36008Value); |
404 | if (x == y) x = y; // no warning |
405 | if (y == x) y = x; // no warning |
406 | } |
407 | |