Home | History | Annotate | Download | only in SemaCXX
      1 // Force x86-64 because some of our heuristics are actually based
      2 // on integer sizes.
      3 
      4 // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -std=c++11 %s
      5 
      6 int test0(long a, unsigned long b) {
      7   enum EnumA {A};
      8   enum EnumB {B};
      9   enum EnumC {C = 0x10000};
     10   return
     11          // (a,b)
     12          (a == (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
     13          (a == (unsigned int) b) +
     14          (a == (unsigned short) b) +
     15          (a == (unsigned char) b) +
     16          ((long) a == b) +  // expected-warning {{comparison of integers of different signs}}
     17          ((int) a == b) +  // expected-warning {{comparison of integers of different signs}}
     18          ((short) a == b) +  // expected-warning {{comparison of integers of different signs}}
     19          ((signed char) a == b) +  // expected-warning {{comparison of integers of different signs}}
     20          ((long) a == (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
     21          ((int) a == (unsigned int) b) +  // expected-warning {{comparison of integers of different signs}}
     22          ((short) a == (unsigned short) b) +
     23          ((signed char) a == (unsigned char) b) +
     24          (a < (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
     25          (a < (unsigned int) b) +
     26          (a < (unsigned short) b) +
     27          (a < (unsigned char) b) +
     28          ((long) a < b) +  // expected-warning {{comparison of integers of different signs}}
     29          ((int) a < b) +  // expected-warning {{comparison of integers of different signs}}
     30          ((short) a < b) +  // expected-warning {{comparison of integers of different signs}}
     31          ((signed char) a < b) +  // expected-warning {{comparison of integers of different signs}}
     32          ((long) a < (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
     33          ((int) a < (unsigned int) b) +  // expected-warning {{comparison of integers of different signs}}
     34          ((short) a < (unsigned short) b) +
     35          ((signed char) a < (unsigned char) b) +
     36 
     37          // (A,b)
     38          (A == (unsigned long) b) +
     39          (A == (unsigned int) b) +
     40          (A == (unsigned short) b) +
     41          (A == (unsigned char) b) +
     42          ((long) A == b) +
     43          ((int) A == b) +
     44          ((short) A == b) +
     45          ((signed char) A == b) +
     46          ((long) A == (unsigned long) b) +
     47          ((int) A == (unsigned int) b) +
     48          ((short) A == (unsigned short) b) +
     49          ((signed char) A == (unsigned char) b) +
     50          (A < (unsigned long) b) +
     51          (A < (unsigned int) b) +
     52          (A < (unsigned short) b) +
     53          (A < (unsigned char) b) +
     54          ((long) A < b) +
     55          ((int) A < b) +
     56          ((short) A < b) +
     57          ((signed char) A < b) +
     58          ((long) A < (unsigned long) b) +
     59          ((int) A < (unsigned int) b) +
     60          ((short) A < (unsigned short) b) +
     61          ((signed char) A < (unsigned char) b) +
     62 
     63          // (a,B)
     64          (a == (unsigned long) B) +
     65          (a == (unsigned int) B) +
     66          (a == (unsigned short) B) +
     67          (a == (unsigned char) B) +
     68          ((long) a == B) +
     69          ((int) a == B) +
     70          ((short) a == B) +
     71          ((signed char) a == B) +
     72          ((long) a == (unsigned long) B) +
     73          ((int) a == (unsigned int) B) +
     74          ((short) a == (unsigned short) B) +
     75          ((signed char) a == (unsigned char) B) +
     76          (a < (unsigned long) B) +  // expected-warning {{comparison of integers of different signs}}
     77          (a < (unsigned int) B) +
     78          (a < (unsigned short) B) +
     79          (a < (unsigned char) B) +
     80          ((long) a < B) +
     81          ((int) a < B) +
     82          ((short) a < B) +
     83          ((signed char) a < B) +
     84          ((long) a < (unsigned long) B) +  // expected-warning {{comparison of integers of different signs}}
     85          ((int) a < (unsigned int) B) +  // expected-warning {{comparison of integers of different signs}}
     86          ((short) a < (unsigned short) B) +
     87          ((signed char) a < (unsigned char) B) +
     88 
     89          // (C,b)
     90          (C == (unsigned long) b) +
     91          (C == (unsigned int) b) +
     92          (C == (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
     93          (C == (unsigned char) b) +  // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
     94          ((long) C == b) +
     95          ((int) C == b) +
     96          ((short) C == b) +
     97          ((signed char) C == b) +
     98          ((long) C == (unsigned long) b) +
     99          ((int) C == (unsigned int) b) +
    100          ((short) C == (unsigned short) b) +
    101          ((signed char) C == (unsigned char) b) +
    102          (C < (unsigned long) b) +
    103          (C < (unsigned int) b) +
    104          (C < (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
    105          (C < (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
    106          ((long) C < b) +
    107          ((int) C < b) +
    108          ((short) C < b) +
    109          ((signed char) C < b) +
    110          ((long) C < (unsigned long) b) +
    111          ((int) C < (unsigned int) b) +
    112          ((short) C < (unsigned short) b) +
    113          ((signed char) C < (unsigned char) b) +
    114 
    115          // (a,C)
    116          (a == (unsigned long) C) +
    117          (a == (unsigned int) C) +
    118          (a == (unsigned short) C) +
    119          (a == (unsigned char) C) +
    120          ((long) a == C) +
    121          ((int) a == C) +
    122          ((short) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always false}}
    123          ((signed char) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always false}}
    124          ((long) a == (unsigned long) C) +
    125          ((int) a == (unsigned int) C) +
    126          ((short) a == (unsigned short) C) +
    127          ((signed char) a == (unsigned char) C) +
    128          (a < (unsigned long) C) +  // expected-warning {{comparison of integers of different signs}}
    129          (a < (unsigned int) C) +
    130          (a < (unsigned short) C) +
    131          (a < (unsigned char) C) +
    132          ((long) a < C) +
    133          ((int) a < C) +
    134          ((short) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always true}}
    135          ((signed char) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always true}}
    136          ((long) a < (unsigned long) C) +  // expected-warning {{comparison of integers of different signs}}
    137          ((int) a < (unsigned int) C) +  // expected-warning {{comparison of integers of different signs}}
    138          ((short) a < (unsigned short) C) +
    139          ((signed char) a < (unsigned char) C) +
    140 
    141          // (0x80000,b)
    142          (0x80000 == (unsigned long) b) +
    143          (0x80000 == (unsigned int) b) +
    144          (0x80000 == (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}}
    145          (0x80000 == (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}}
    146          ((long) 0x80000 == b) +
    147          ((int) 0x80000 == b) +
    148          ((short) 0x80000 == b) +
    149          ((signed char) 0x80000 == b) +
    150          ((long) 0x80000 == (unsigned long) b) +
    151          ((int) 0x80000 == (unsigned int) b) +
    152          ((short) 0x80000 == (unsigned short) b) +
    153          ((signed char) 0x80000 == (unsigned char) b) +
    154          (0x80000 < (unsigned long) b) +
    155          (0x80000 < (unsigned int) b) +
    156          (0x80000 < (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}}
    157          (0x80000 < (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}}
    158          ((long) 0x80000 < b) +
    159          ((int) 0x80000 < b) +
    160          ((short) 0x80000 < b) +
    161          ((signed char) 0x80000 < b) +
    162          ((long) 0x80000 < (unsigned long) b) +
    163          ((int) 0x80000 < (unsigned int) b) +
    164          ((short) 0x80000 < (unsigned short) b) +
    165          ((signed char) 0x80000 < (unsigned char) b) +
    166 
    167          // (a,0x80000)
    168          (a == (unsigned long) 0x80000) +
    169          (a == (unsigned int) 0x80000) +
    170          (a == (unsigned short) 0x80000) +
    171          (a == (unsigned char) 0x80000) +
    172          ((long) a == 0x80000) +
    173          ((int) a == 0x80000) +
    174          ((short) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always false}}
    175          ((signed char) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always false}}
    176          ((long) a == (unsigned long) 0x80000) +
    177          ((int) a == (unsigned int) 0x80000) +
    178          ((short) a == (unsigned short) 0x80000) +
    179          ((signed char) a == (unsigned char) 0x80000) +
    180          (a < (unsigned long) 0x80000) +  // expected-warning {{comparison of integers of different signs}}
    181          (a < (unsigned int) 0x80000) +
    182          (a < (unsigned short) 0x80000) +
    183          (a < (unsigned char) 0x80000) +
    184          ((long) a < 0x80000) +
    185          ((int) a < 0x80000) +
    186          ((short) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always true}}
    187          ((signed char) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always true}}
    188          ((long) a < (unsigned long) 0x80000) +  // expected-warning {{comparison of integers of different signs}}
    189          ((int) a < (unsigned int) 0x80000) +  // expected-warning {{comparison of integers of different signs}}
    190          ((short) a < (unsigned short) 0x80000) +
    191          ((signed char) a < (unsigned char) 0x80000) +
    192 
    193          10
    194     ;
    195 }
    196 
    197 int test1(int i) {
    198   enum en { zero };
    199   return i > zero;
    200 }
    201 
    202 enum E { e };
    203 void test2(int i, void *vp) {
    204   if (test1 == vp) { } // expected-warning{{equality comparison between function pointer and void pointer}}
    205   if (test1 == e) { } // expected-error{{comparison between pointer and integer}}
    206   if (vp < 0) { }
    207   if (test1 < e) { } // expected-error{{comparison between pointer and integer}}
    208 }
    209 
    210 // PR7536
    211 static const unsigned int kMax = 0;
    212 int pr7536() {
    213   return (kMax > 0);
    214 }
    215 
    216 // -Wsign-compare should not warn when ?: operands have different signedness.
    217 // This will be caught by -Wsign-conversion
    218 void test3() {
    219   unsigned long a;
    220   signed long b;
    221   (void) (true ? a : b);
    222   (void) (true ? (unsigned int)a : (signed int)b);
    223   (void) (true ? b : a);
    224   (void) (true ? (unsigned char)b : (signed char)a);
    225 }
    226 
    227 // Test comparison of short to unsigned.  If tautological compare does not
    228 // trigger, then the signed comparison warning will.
    229 void test4(short s) {
    230   // A is max short plus 1.  All zero and positive shorts are smaller than it.
    231   // All negative shorts are cast towards the max unsigned range.  Relation
    232   // comparisons are possible, but equality comparisons are tautological.
    233   const unsigned A = 32768;
    234   void (s < A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    235   void (s > A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    236   void (s <= A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    237   void (s >= A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    238 
    239   void (s == A); // expected-warning{{comparison of constant 32768 with expression of type 'short' is always false}}
    240   void (s != A); // expected-warning{{comparison of constant 32768 with expression of type 'short' is always true}}
    241 
    242   // When negative one is converted to an unsigned value, it becomes the max
    243   // unsigned.  Likewise, a negative one short can also be converted to max
    244   // unsigned.
    245   const unsigned B = -1;
    246   void (s < B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    247   void (s > B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    248   void (s <= B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    249   void (s >= B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    250   void (s == B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    251   void (s != B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
    252 
    253 }
    254 
    255 void test5(bool b) {
    256   (void) (b < -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always false}}
    257   (void) (b > -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always true}}
    258   (void) (b == -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always false}}
    259   (void) (b != -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always true}}
    260   (void) (b <= -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always false}}
    261   (void) (b >= -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always true}}
    262 
    263   (void) (b < -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always false}}
    264   (void) (b > -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always true}}
    265   (void) (b == -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always false}}
    266   (void) (b != -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always true}}
    267   (void) (b <= -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always false}}
    268   (void) (b >= -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always true}}
    269 
    270   (void) (b < 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always true}}
    271   (void) (b > 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always false}}
    272   (void) (b == 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always false}}
    273   (void) (b != 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always true}}
    274   (void) (b <= 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always true}}
    275   (void) (b >= 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always false}}
    276 
    277   (void) (b < 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always true}}
    278   (void) (b > 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always false}}
    279   (void) (b == 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always false}}
    280   (void) (b != 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always true}}
    281   (void) (b <= 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always true}}
    282   (void) (b >= 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always false}}
    283 }
    284 
    285 void test6(signed char sc) {
    286   (void)(sc < 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
    287   (void)(sc > 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
    288   (void)(sc <= 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
    289   (void)(sc >= 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
    290   (void)(sc == 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
    291   (void)(sc != 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
    292 
    293   (void)(200 < sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
    294   (void)(200 > sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
    295   (void)(200 <= sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
    296   (void)(200 >= sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
    297   (void)(200 == sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
    298   (void)(200 != sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
    299 }
    300 
    301 // Test many signedness combinations.
    302 void test7(unsigned long other) {
    303   // Common unsigned, other unsigned, constant unsigned
    304   (void)((unsigned)other != (unsigned long)(0x1ffffffff)); // expected-warning{{true}}
    305   (void)((unsigned)other != (unsigned long)(0xffffffff));
    306   (void)((unsigned long)other != (unsigned)(0x1ffffffff));
    307   (void)((unsigned long)other != (unsigned)(0xffffffff));
    308 
    309   // Common unsigned, other signed, constant unsigned
    310   (void)((int)other != (unsigned long)(0xffffffffffffffff)); // expected-warning{{different signs}}
    311   (void)((int)other != (unsigned long)(0x00000000ffffffff)); // expected-warning{{true}}
    312   (void)((int)other != (unsigned long)(0x000000000fffffff));
    313   (void)((int)other < (unsigned long)(0x00000000ffffffff));  // expected-warning{{different signs}}
    314   (void)((int)other == (unsigned)(0x800000000));
    315 
    316   // Common unsigned, other unsigned, constant signed
    317   (void)((unsigned long)other != (int)(0xffffffff));  // expected-warning{{different signs}}
    318 
    319   // Common unsigned, other signed, constant signed
    320   // Should not be possible as the common type should also be signed.
    321 
    322   // Common signed, other signed, constant signed
    323   (void)((int)other != (long)(0xffffffff));  // expected-warning{{true}}
    324   (void)((int)other != (long)(0xffffffff00000000));  // expected-warning{{true}}
    325   (void)((int)other != (long)(0xfffffff));
    326   (void)((int)other != (long)(0xfffffffff0000000));
    327 
    328   // Common signed, other signed, constant unsigned
    329   (void)((int)other != (unsigned char)(0xffff));
    330   (void)((int)other != (unsigned char)(0xff));
    331 
    332   // Common signed, other unsigned, constant signed
    333   (void)((unsigned char)other != (int)(0xff));
    334   (void)((unsigned char)other != (int)(0xffff));  // expected-warning{{true}}
    335 
    336   // Common signed, other unsigned, constant unsigned
    337   (void)((unsigned char)other != (unsigned short)(0xff));
    338   (void)((unsigned char)other != (unsigned short)(0x100)); // expected-warning{{true}}
    339   (void)((unsigned short)other != (unsigned char)(0xff));
    340 }
    341 
    342 void test8(int x) {
    343   enum E {
    344     Negative = -1,
    345     Positive = 1
    346   };
    347 
    348   (void)((E)x == 1);
    349   (void)((E)x == -1);
    350 }
    351 
    352 void test9(int x) {
    353   enum E : int {
    354     Positive = 1
    355   };
    356   (void)((E)x == 1);
    357 }
    358 
    359 namespace templates {
    360   template<class T> T max();
    361 
    362   template<> constexpr int max<int>() { return 2147483647; };
    363 
    364   template<typename T>
    365   bool less_than_max(short num, T value) {
    366     const T vmax = max<T>();
    367     return (vmax >= num);  // no warning
    368   }
    369 
    370   template<typename T>
    371   bool less_than_max(short num) {
    372     // This should trigger one warning on the template pattern, and not a
    373     // warning per specialization.
    374     return num < max<int>();  // expected-warning{{comparison of constant 2147483647 with expression of type 'short' is always true}}
    375   }
    376 
    377   void test10(short num, int x) {
    378     less_than_max(num, x);
    379     less_than_max<int>(num);
    380     less_than_max<long>(num);
    381     less_than_max<short>(num);
    382   }
    383 
    384   template<typename T>
    385   inline bool less_than_zero(T num, T value) {
    386     return num < 0;  // no warning
    387   }
    388 
    389   template<typename T>
    390   inline bool less_than_zero(unsigned num) {
    391     // This should trigger one warning on the template pattern, and not a
    392     // warning per specialization.
    393     return num < 0;  // expected-warning{{comparison of unsigned expression < 0 is always false}}
    394   }
    395 
    396   void test11(unsigned num) {
    397     less_than_zero(num, num);
    398     less_than_zero<int>(num);
    399     less_than_zero<long>(num);
    400     less_than_zero<short>(num);
    401   }
    402 
    403   template<unsigned n> bool compare(unsigned k) { return k >= n; }
    404 
    405   void test12() {
    406     compare<0>(42);
    407   }
    408 
    409   struct A { static int x; };
    410   struct B { static int x; };
    411   typedef A otherA;
    412 
    413   template <typename T>
    414   void testx() {
    415     if (A::x == T::x &&  // no warning
    416         A::x == otherA::x)  // expected-warning{{self-comparison always evaluates to true}}
    417       return;
    418   }
    419 
    420   void test13() {
    421     testx<A>();
    422     testx<B>();
    423   }
    424 }
    425