Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-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 integers of different signs}}
     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 integers of different signs}}
     89          ((int) a < (unsigned int) B) +  // expected-warning {{comparison of integers of different signs}}
     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   if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}
    312     return 0;
    313   return 20;
    314 }
    315 
    316 // PR10336
    317 int test9(int sv, unsigned uv, long slv) {
    318   return sv == (uv ^= slv); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}}
    319 }
    320 
    321 void test10(void) {
    322   int si;
    323   unsigned int ui;
    324   long sl;
    325 
    326   _Bool b;
    327   b = (si == (ui = sl)); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}}
    328   b = (si == (ui = sl&15));
    329 }
    330 
    331 // PR11572
    332 struct test11S { unsigned x : 30; };
    333 int test11(unsigned y, struct test11S *p) {
    334   return y > (p->x >> 24); // no-warning
    335 }
    336 
    337 typedef char one_char[1];
    338 typedef char two_chars[2];
    339 
    340 void test12(unsigned a) {
    341   if (0 && -1 > a) { }
    342 }
    343