484 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -Wtautological-constant-in-range-compare %s -Wno-unreachable-code -DTEST=12// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -Wtype-limits %s -Wno-unreachable-code -DTEST=23 4int test(char *C) { // nothing here should warn.5 return C != ((void*)0);6 return C != (void*)0;7 return C != 0;8 return C != 1; // expected-warning {{comparison between pointer and integer ('char *' and 'int')}}9}10 11int ints(long a, unsigned long b) {12 enum EnumA {A};13 enum EnumB {B};14 enum EnumC {C = 0x10000};15 return16 // (a,b)17 (a == (unsigned long) b) + // expected-warning {{comparison of integers of different signs}}18 (a == (unsigned int) b) +19 (a == (unsigned short) b) +20 (a == (unsigned char) b) +21 ((long) a == b) + // expected-warning {{comparison of integers of different signs}}22 ((int) a == b) + // expected-warning {{comparison of integers of different signs}}23 ((short) a == b) + // expected-warning {{comparison of integers of different signs}}24 ((signed char) a == b) + // expected-warning {{comparison of integers of different signs}}25 ((long) a == (unsigned long) b) + // expected-warning {{comparison of integers of different signs}}26 ((int) a == (unsigned int) b) + // expected-warning {{comparison of integers of different signs}}27 ((short) a == (unsigned short) b) +28 ((signed char) a == (unsigned char) b) +29 (a < (unsigned long) b) + // expected-warning {{comparison of integers of different signs}}30 (a < (unsigned int) b) +31 (a < (unsigned short) b) +32 (a < (unsigned char) b) +33 ((long) a < b) + // expected-warning {{comparison of integers of different signs}}34 ((int) a < b) + // expected-warning {{comparison of integers of different signs}}35 ((short) a < b) + // expected-warning {{comparison of integers of different signs}}36 ((signed char) a < b) + // expected-warning {{comparison of integers of different signs}}37 ((long) a < (unsigned long) b) + // expected-warning {{comparison of integers of different signs}}38 ((int) a < (unsigned int) b) + // expected-warning {{comparison of integers of different signs}}39 ((short) a < (unsigned short) b) +40 ((signed char) a < (unsigned char) b) +41 42 // (A,b)43 (A == (unsigned long) b) +44 (A == (unsigned int) b) +45 (A == (unsigned short) b) +46 (A == (unsigned char) b) +47 ((long) A == b) +48 ((int) A == b) +49 ((short) A == b) +50 ((signed char) A == b) +51 ((long) A == (unsigned long) b) +52 ((int) A == (unsigned int) b) +53 ((short) A == (unsigned short) b) +54 ((signed char) A == (unsigned char) b) +55 (A < (unsigned long) b) +56 (A < (unsigned int) b) +57 (A < (unsigned short) b) +58 (A < (unsigned char) b) +59 ((long) A < b) +60 ((int) A < b) +61 ((short) A < b) +62 ((signed char) A < b) +63 ((long) A < (unsigned long) b) +64 ((int) A < (unsigned int) b) +65 ((short) A < (unsigned short) b) +66 ((signed char) A < (unsigned char) b) +67 68 // (a,B)69 (a == (unsigned long) B) +70 (a == (unsigned int) B) +71 (a == (unsigned short) B) +72 (a == (unsigned char) B) +73 ((long) a == B) +74 ((int) a == B) +75 ((short) a == B) +76 ((signed char) a == B) +77 ((long) a == (unsigned long) B) +78 ((int) a == (unsigned int) B) +79 ((short) a == (unsigned short) B) +80 ((signed char) a == (unsigned char) B) +81 (a < (unsigned long) B) + // expected-warning {{comparison of unsigned expression < 0 is always false}}82 (a < (unsigned int) B) +83 (a < (unsigned short) B) +84 (a < (unsigned char) B) +85 ((long) a < B) +86 ((int) a < B) +87 ((short) a < B) +88 ((signed char) a < B) +89 ((long) a < (unsigned long) B) + // expected-warning {{comparison of unsigned expression < 0 is always false}}90 ((int) a < (unsigned int) B) + // expected-warning {{comparison of unsigned expression < 0 is always false}}91 ((short) a < (unsigned short) B) +92 ((signed char) a < (unsigned char) B) +93 94 // (C,b)95 (C == (unsigned long) b) +96 (C == (unsigned int) b) +97 (C == (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}98 (C == (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}99 ((long) C == b) +100 ((int) C == b) +101 ((short) C == b) +102 ((signed char) C == b) +103 ((long) C == (unsigned long) b) +104 ((int) C == (unsigned int) b) +105 ((short) C == (unsigned short) b) +106 ((signed char) C == (unsigned char) b) +107 (C < (unsigned long) b) +108 (C < (unsigned int) b) +109 (C < (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}110 (C < (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}111 ((long) C < b) +112 ((int) C < b) +113 ((short) C < b) +114 ((signed char) C < b) +115 ((long) C < (unsigned long) b) +116 ((int) C < (unsigned int) b) +117 ((short) C < (unsigned short) b) +118 ((signed char) C < (unsigned char) b) +119 120 // (a,C)121 (a == (unsigned long) C) +122 (a == (unsigned int) C) +123 (a == (unsigned short) C) +124 (a == (unsigned char) C) +125 ((long) a == C) +126 ((int) a == C) +127 ((short) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always false}}128 ((signed char) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always false}}129 ((long) a == (unsigned long) C) +130 ((int) a == (unsigned int) C) +131 ((short) a == (unsigned short) C) +132 ((signed char) a == (unsigned char) C) +133 (a < (unsigned long) C) + // expected-warning {{comparison of integers of different signs}}134 (a < (unsigned int) C) +135 (a < (unsigned short) C) +136 (a < (unsigned char) C) +137 ((long) a < C) +138 ((int) a < C) +139 ((short) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always true}}140 ((signed char) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always true}}141 ((long) a < (unsigned long) C) + // expected-warning {{comparison of integers of different signs}}142 ((int) a < (unsigned int) C) + // expected-warning {{comparison of integers of different signs}}143 ((short) a < (unsigned short) C) +144 ((signed char) a < (unsigned char) C) +145 146 // (0x80000,b)147 (0x80000 == (unsigned long) b) +148 (0x80000 == (unsigned int) b) +149 (0x80000 == (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}}150 (0x80000 == (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}}151 ((long) 0x80000 == b) +152 ((int) 0x80000 == b) +153 ((short) 0x80000 == b) +154 ((signed char) 0x80000 == b) +155 ((long) 0x80000 == (unsigned long) b) +156 ((int) 0x80000 == (unsigned int) b) +157 ((short) 0x80000 == (unsigned short) b) +158 ((signed char) 0x80000 == (unsigned char) b) +159 (0x80000 < (unsigned long) b) +160 (0x80000 < (unsigned int) b) +161 (0x80000 < (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}}162 (0x80000 < (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}}163 ((long) 0x80000 < b) +164 ((int) 0x80000 < b) +165 ((short) 0x80000 < b) +166 ((signed char) 0x80000 < b) +167 ((long) 0x80000 < (unsigned long) b) +168 ((int) 0x80000 < (unsigned int) b) +169 ((short) 0x80000 < (unsigned short) b) +170 ((signed char) 0x80000 < (unsigned char) b) +171 172 // (a,0x80000)173 (a == (unsigned long) 0x80000) +174 (a == (unsigned int) 0x80000) +175 (a == (unsigned short) 0x80000) +176 (a == (unsigned char) 0x80000) +177 ((long) a == 0x80000) +178 ((int) a == 0x80000) +179 ((short) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always false}}180 ((signed char) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always false}}181 ((long) a == (unsigned long) 0x80000) +182 ((int) a == (unsigned int) 0x80000) +183 ((short) a == (unsigned short) 0x80000) +184 ((signed char) a == (unsigned char) 0x80000) +185 (a < (unsigned long) 0x80000) + // expected-warning {{comparison of integers of different signs}}186 (a < (unsigned int) 0x80000) +187 (a < (unsigned short) 0x80000) +188 (a < (unsigned char) 0x80000) +189 ((long) a < 0x80000) +190 ((int) a < 0x80000) +191 ((short) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always true}}192 ((signed char) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always true}}193 ((long) a < (unsigned long) 0x80000) + // expected-warning {{comparison of integers of different signs}}194 ((int) a < (unsigned int) 0x80000) + // expected-warning {{comparison of integers of different signs}}195 ((short) a < (unsigned short) 0x80000) +196 ((signed char) a < (unsigned char) 0x80000) +197 198 // We should be able to avoid warning about this.199 (b != (a < 4 ? 1 : 2)) +200 201 10202 ;203}204 205int equal(char *a, const char *b) {206 return a == b;207}208 209int arrays(char (*a)[5], char(*b)[10], char(*c)[5]) {210 int d = (a == c);211 return a == b; // expected-warning {{comparison of distinct pointer types}}212}213 214int pointers(int *a) {215 return a > 0; // expected-warning {{ordered comparison between pointer and zero ('int *' and 'int') is an extension}}216 return a > 42; // expected-warning {{ordered comparison between pointer and integer ('int *' and 'int')}}217 return a > (void *)0; // expected-warning {{comparison of distinct pointer types}}218}219 220int function_pointers(int (*a)(int), int (*b)(int), void (*c)(int)) {221 return a > b; // expected-warning {{ordered comparison of function pointers}}222 return function_pointers > function_pointers; // expected-warning {{self-comparison always evaluates to false}} expected-warning{{ordered comparison of function pointers}}223 return a > c; // expected-warning {{comparison of distinct pointer types}} expected-warning {{ordered comparison of function pointers}}224 return a == (void *) 0;225 return a == (void *) 1; // expected-warning {{equality comparison between function pointer and void pointer}}226}227 228int void_pointers(void* foo) {229 return foo == (void*) 0;230 return foo == (void*) 1;231}232 233 234int test1(int i) {235 enum en { zero };236 return i > zero;237}238 239// PR5937240int test2(int i32) {241 struct foo {242 unsigned int u8 : 8;243 unsigned long long u31 : 31;244 unsigned long long u32 : 32;245 unsigned long long u63 : 63;246 unsigned long long u64 : 64;247 } *x;248 249 if (x->u8 == i32) { // comparison in int32, exact250 return 0;251 } else if (x->u31 == i32) { // comparison in int32, exact252 return 1;253 } else if (x->u32 == i32) { // expected-warning {{comparison of integers of different signs}}254 return 2;255 } else if (x->u63 == i32) { // comparison in uint64, exact because ==256 return 3;257 } else if (x->u64 == i32) { // expected-warning {{comparison of integers of different signs}}258 return 4;259 } else {260 return 5;261 }262}263 264// PR5887265void test3(void) {266 unsigned short x, y;267 unsigned int z;268 if ((x > y ? x : y) > z)269 (void) 0;270}271 272// PR5961273extern char *ptr4;274void test4(void) {275 long value;276 if (value < (unsigned long) &ptr4) // expected-warning {{comparison of integers of different signs}}277 return;278}279 280// PR4807281int test5(unsigned int x) {282 return (x < 0) // expected-warning {{comparison of unsigned expression < 0 is always false}}283 && (0 > x) // expected-warning {{comparison of 0 > unsigned expression is always false}}284 && (x >= 0) // expected-warning {{comparison of unsigned expression >= 0 is always true}}285 && (0 <= x); // expected-warning {{comparison of 0 <= unsigned expression is always true}}286}287 288struct bitfield {289 int a : 3;290 unsigned b : 3;291 long c : 40;292 unsigned long d : 40;293};294 295void test5a(struct bitfield a) {296 if (a.a < 0) {}297 if (a.b < 0) {} // expected-warning {{comparison of unsigned expression < 0 is always false}}298 if (a.c < 0) {}299 if (a.d < 0) {} // expected-warning {{comparison of unsigned expression < 0 is always false}}300}301 302int test6(unsigned i, unsigned power) {303 unsigned x = (i < (1 << power) ? i : 0);304 return x != 3 ? 1 << power : i;305}306 307// enum >= (enum)0 comparison should not generate any warnings308enum rdar8414119_Vals { X, Y, Z };309#define ZERO 0310#define CHECK(x) (x >= X)311void rdar8414119_foo(enum rdar8414119_Vals v) {312 if (CHECK(v)) // no-warning313 return;314 if (v >= X) // no-warning315 return;316}317int rdar8414119_bar(unsigned x) {318 return x >= ZERO; // no-warning319}320#undef ZERO321#undef CHECK322 323int rdar8511238(void) {324 enum A { A_foo, A_bar };325 enum A a;326 327 if (a == 0)328 return 0;329 if (a != 0)330 return 0;331 if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}332 return 0;333 if (a <= 0)334 return 0;335 if (a > 0)336 return 0;337 if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}338 return 0;339 340 if (0 == a)341 return 0;342 if (0 != a)343 return 0;344 if (0 < a)345 return 0;346 if (0 <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}347 return 0;348 if (0 > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}349 return 0;350 if (0 >= a)351 return 0;352 353 if (a == 0U)354 return 0;355 if (a != 0U)356 return 0;357 if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}358 return 0;359 if (a <= 0U)360 return 0;361 if (a > 0U)362 return 0;363 if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}364 return 0;365 366 if (0U == a)367 return 0;368 if (0U != a)369 return 0;370 if (0U < a)371 return 0;372 if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}373 return 0;374 if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}375 return 0;376 if (0U >= a)377 return 0;378 379 return 20;380}381 382// PR10336383int test9(int sv, unsigned uv, long slv) {384 return sv == (uv ^= slv); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}}385}386 387void test10(void) {388 int si;389 unsigned int ui;390 long sl;391 392 _Bool b;393 b = (si == (ui = sl)); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}}394 b = (si == (ui = sl&15));395}396 397// PR11572398struct test11S { unsigned x : 30; };399int test11(unsigned y, struct test11S *p) {400 return y > (p->x >> 24); // no-warning401}402 403typedef char one_char[1];404typedef char two_chars[2];405 406void test12(unsigned a) {407 if (0 && -1 > a) { }408}409 410// PR36008411 412enum PR36008EnumTest {413 kPR36008Value = 0,414};415 416void pr36008(enum PR36008EnumTest lhs) {417 __typeof__(lhs) x = lhs;418 __typeof__(kPR36008Value) y = (kPR36008Value);419 if (x == y) x = y; // no warning420 if (y == x) y = x; // no warning421}422 423int test13(unsigned a, int b) {424 return a > ~(95 != b); // expected-warning {{comparison of integers of different signs}}425}426 427int test14(unsigned a, unsigned b) {428 return a > ~b; // no-warning429}430 431int test15(unsigned a, int b) {432 return a > -(95 != b); // expected-warning {{comparison of integers of different signs}}433}434 435int test16(unsigned a, unsigned b) {436 return a > -b; // no-warning437}438 439int test17(int a, unsigned b) {440 return a > -(-b); // expected-warning {{comparison of integers of different signs}}441}442 443int test18(int a) {444 return a == -(-2147483648); // expected-warning {{result of comparison of constant 2147483648 with expression of type 'int' is always false}}445}446 447int test19(int n) {448 return -(n & 15) <= -15; // no-warning449}450 451#if TEST == 1452int test20(int n) {453 return -(n & 15) <= -17; // expected-warning {{result of comparison of 5-bit signed value <= -17 is always false}}454}455#endif456 457int test21(short n) {458 return -n == 32768; // no-warning459}460 461#if TEST == 1462int test22(short n) {463 return -n == 65536; // expected-warning {{result of comparison of 17-bit signed value == 65536 is always false}}464}465#endif466 467int test23(unsigned short n) {468 return ~n == 32768; // no-warning469}470 471int test24(short n) {472 return ~n == 32767; // no-warning473}474 475#if TEST == 1476int test25(unsigned short n) {477 return ~n == 65536; // expected-warning {{result of comparison of 17-bit signed value == 65536 is always false}}478}479 480int test26(short n) {481 return ~n == 32768; // expected-warning {{result of comparison of 16-bit signed value == 32768 is always false}}482}483#endif484