Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -fsyntax-only -verify -Wconversion -nostdinc -isystem %S/Inputs -triple x86_64-apple-darwin %s -Wno-unreachable-code
      2 
      3 #include <conversion.h>
      4 
      5 #define BIG 0x7f7f7f7f7f7f7f7fL
      6 
      7 void test0(char c, short s, int i, long l, long long ll) {
      8   c = c;
      9   c = s; // expected-warning {{implicit conversion loses integer precision}}
     10   c = i; // expected-warning {{implicit conversion loses integer precision}}
     11   c = l; // expected-warning {{implicit conversion loses integer precision}}
     12   s = c;
     13   s = s;
     14   s = i; // expected-warning {{implicit conversion loses integer precision}}
     15   s = l; // expected-warning {{implicit conversion loses integer precision}}
     16   i = c;
     17   i = s;
     18   i = i;
     19   i = l; // expected-warning {{implicit conversion loses integer precision}}
     20   l = c;
     21   l = s;
     22   l = i;
     23   l = l;
     24 
     25   c = (char) 0;
     26   c = (short) 0;
     27   c = (int) 0;
     28   c = (long) 0;
     29   s = (char) 0;
     30   s = (short) 0;
     31   s = (int) 0;
     32   s = (long) 0;
     33   i = (char) 0;
     34   i = (short) 0;
     35   i = (int) 0;
     36   i = (long) 0;
     37   l = (char) 0;
     38   l = (short) 0;
     39   l = (int) 0;
     40   l = (long) 0;
     41 
     42   c = (char) BIG;
     43   c = (short) BIG; // expected-warning {{implicit conversion from 'short' to 'char' changes value}}
     44   c = (int) BIG; // expected-warning {{implicit conversion from 'int' to 'char' changes value}}
     45   c = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
     46   s = (char) BIG;
     47   s = (short) BIG;
     48   s = (int) BIG; // expected-warning {{implicit conversion from 'int' to 'short' changes value}}
     49   s = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'short' changes value}}
     50   i = (char) BIG;
     51   i = (short) BIG;
     52   i = (int) BIG;
     53   i = (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}
     54   l = (char) BIG;
     55   l = (short) BIG;
     56   l = (int) BIG;
     57   l = (long) BIG;
     58 }
     59 
     60 char test1(long long ll) {
     61   return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}
     62   return (long) ll; // expected-warning {{implicit conversion loses integer precision}}
     63   return (int) ll; // expected-warning {{implicit conversion loses integer precision}}
     64   return (short) ll; // expected-warning {{implicit conversion loses integer precision}}
     65   return (char) ll;
     66   return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'char' changes value}}
     67   return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
     68   return (int) BIG; // expected-warning {{implicit conversion from 'int' to 'char' changes value}}
     69   return (short) BIG; // expected-warning {{implicit conversion from 'short' to 'char' changes value}}
     70   return (char) BIG;
     71 }
     72 
     73 short test2(long long ll) {
     74   return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}
     75   return (long) ll; // expected-warning {{implicit conversion loses integer precision}}
     76   return (int) ll; // expected-warning {{implicit conversion loses integer precision}}
     77   return (short) ll;
     78   return (char) ll;
     79   return (long long) BIG;  // expected-warning {{implicit conversion from 'long long' to 'short' changes value}}
     80   return (long) BIG;  // expected-warning {{implicit conversion from 'long' to 'short' changes value}}
     81   return (int) BIG;  // expected-warning {{implicit conversion from 'int' to 'short' changes value}}
     82   return (short) BIG;
     83   return (char) BIG;
     84 }
     85 
     86 int test3(long long ll) {
     87   return (long long) ll;  // expected-warning {{implicit conversion loses integer precision}}
     88   return (long) ll;  // expected-warning {{implicit conversion loses integer precision}}
     89   return (int) ll;
     90   return (short) ll;
     91   return (char) ll;
     92   return (long long) BIG;  // expected-warning {{implicit conversion from 'long long' to 'int' changes value}}
     93   return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}
     94   return (int) BIG;
     95   return (short) BIG;
     96   return (char) BIG;
     97 }
     98 
     99 long test4(long long ll) {
    100   return (long long) ll;
    101   return (long) ll;
    102   return (int) ll;
    103   return (short) ll;
    104   return (char) ll;
    105   return (long long) BIG;
    106   return (long) BIG;
    107   return (int) BIG;
    108   return (short) BIG;
    109   return (char) BIG;
    110 }
    111 
    112 long long test5(long long ll) {
    113   return (long long) ll;
    114   return (long) ll;
    115   return (int) ll;
    116   return (short) ll;
    117   return (char) ll;
    118   return (long long) BIG;
    119   return (long) BIG;
    120   return (int) BIG;
    121   return (short) BIG;
    122   return (char) BIG;
    123 }
    124 
    125 void takes_char(char);
    126 void takes_short(short);
    127 void takes_int(int);
    128 void takes_long(long);
    129 void takes_longlong(long long);
    130 void takes_float(float);
    131 void takes_double(double);
    132 void takes_longdouble(long double);
    133 
    134 void test6(char v) {
    135   takes_char(v);
    136   takes_short(v);
    137   takes_int(v);
    138   takes_long(v);
    139   takes_longlong(v);
    140   takes_float(v);
    141   takes_double(v);
    142   takes_longdouble(v);
    143 }
    144 
    145 void test7(short v) {
    146   takes_char(v); // expected-warning {{implicit conversion loses integer precision}}
    147   takes_short(v);
    148   takes_int(v);
    149   takes_long(v);
    150   takes_longlong(v);
    151   takes_float(v);
    152   takes_double(v);
    153   takes_longdouble(v);
    154 }
    155 
    156 void test8(int v) {
    157   takes_char(v); // expected-warning {{implicit conversion loses integer precision}}
    158   takes_short(v); // expected-warning {{implicit conversion loses integer precision}}
    159   takes_int(v);
    160   takes_long(v);
    161   takes_longlong(v);
    162   takes_float(v);
    163   takes_double(v);
    164   takes_longdouble(v);
    165 }
    166 
    167 void test9(long v) {
    168   takes_char(v); // expected-warning {{implicit conversion loses integer precision}}
    169   takes_short(v); // expected-warning {{implicit conversion loses integer precision}}
    170   takes_int(v); // expected-warning {{implicit conversion loses integer precision}}
    171   takes_long(v);
    172   takes_longlong(v);
    173   takes_float(v);
    174   takes_double(v);
    175   takes_longdouble(v);
    176 }
    177 
    178 void test10(long long v) {
    179   takes_char(v); // expected-warning {{implicit conversion loses integer precision}}
    180   takes_short(v); // expected-warning {{implicit conversion loses integer precision}}
    181   takes_int(v); // expected-warning {{implicit conversion loses integer precision}}
    182   takes_long(v);
    183   takes_longlong(v);
    184   takes_float(v);
    185   takes_double(v);
    186   takes_longdouble(v);
    187 }
    188 
    189 void test11(float v) {
    190   takes_char(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    191   takes_short(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    192   takes_int(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    193   takes_long(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    194   takes_longlong(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    195   takes_float(v);
    196   takes_double(v);
    197   takes_longdouble(v);
    198 }
    199 
    200 void test12(double v) {
    201   takes_char(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    202   takes_short(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    203   takes_int(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    204   takes_long(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    205   takes_longlong(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    206   takes_float(v); // expected-warning {{implicit conversion loses floating-point precision}}
    207   takes_double(v);
    208   takes_longdouble(v);
    209 }
    210 
    211 void test13(long double v) {
    212   takes_char(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    213   takes_short(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    214   takes_int(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    215   takes_long(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    216   takes_longlong(v); // expected-warning {{implicit conversion turns floating-point number into integer}}
    217   takes_float(v); // expected-warning {{implicit conversion loses floating-point precision}}
    218   takes_double(v); // expected-warning {{implicit conversion loses floating-point precision}}
    219   takes_longdouble(v);
    220 }
    221 
    222 void test14(long l) {
    223   // Fine because of the boolean whitelist.
    224   char c;
    225   c = (l == 4);
    226   c = ((l <= 4) && (l >= 0));
    227   c = ((l <= 4) && (l >= 0)) || (l > 20);
    228 }
    229 
    230 void test15(char c) {
    231   c = c + 1 + c * 2;
    232   c = (short) c + 1 + c * 2; // expected-warning {{implicit conversion loses integer precision}}
    233 }
    234 
    235 // PR 5422
    236 extern void *test16_external;
    237 void test16(void) {
    238   int a = (unsigned long) &test16_external; // expected-warning {{implicit conversion loses integer precision}}
    239 }
    240 
    241 // PR 5938
    242 void test17() {
    243   union {
    244     unsigned long long a : 8;
    245     unsigned long long b : 32;
    246     unsigned long long c;
    247   } U;
    248 
    249   unsigned int x;
    250   x = U.a;
    251   x = U.b;
    252   x = U.c; // expected-warning {{implicit conversion loses integer precision}}
    253 }
    254 
    255 // PR 5939
    256 void test18() {
    257   union {
    258     unsigned long long a : 1;
    259     unsigned long long b;
    260   } U;
    261 
    262   int x;
    263   x = (U.a ? 0 : 1);
    264   x = (U.b ? 0 : 1);
    265 }
    266 
    267 // None of these should warn.
    268 unsigned char test19(unsigned long u64) {
    269   unsigned char x1 = u64 & 0xff;
    270   unsigned char x2 = u64 >> 56;
    271 
    272   unsigned char mask = 0xee;
    273   unsigned char x3 = u64 & mask;
    274   return x1 + x2 + x3;
    275 }
    276 
    277 // <rdar://problem/7631400>
    278 void test_7631400(void) {
    279   // This should show up despite the caret being inside a macro substitution
    280   char s = LONG_MAX; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
    281 }
    282 
    283 // <rdar://problem/7676608>: assertion for compound operators with non-integral RHS
    284 void f7676608(int);
    285 void test_7676608(void) {
    286   float q = 0.7f;
    287   char c = 5;
    288   f7676608(c *= q);
    289 }
    290 
    291 // <rdar://problem/7904686>
    292 void test_7904686(void) {
    293   const int i = -1;
    294   unsigned u1 = i; // expected-warning {{implicit conversion changes signedness}}
    295   u1 = i; // expected-warning {{implicit conversion changes signedness}}
    296 
    297   unsigned u2 = -1; // expected-warning {{implicit conversion changes signedness}}
    298   u2 = -1; // expected-warning {{implicit conversion changes signedness}}
    299 }
    300 
    301 // <rdar://problem/8232669>: don't warn about conversions required by
    302 // contexts in system headers
    303 void test_8232669(void) {
    304   unsigned bitset[20];
    305   SETBIT(bitset, 0);
    306 
    307   unsigned y = 50;
    308   SETBIT(bitset, y);
    309 
    310 #define USER_SETBIT(set,bit) do { int i = bit; set[i/(8*sizeof(set[0]))] |= (1 << (i%(8*sizeof(set)))); } while(0)
    311   USER_SETBIT(bitset, 0); // expected-warning 2 {{implicit conversion changes signedness}}
    312 }
    313 
    314 // <rdar://problem/8559831>
    315 enum E8559831a { E8559831a_val };
    316 enum E8559831b { E8559831b_val };
    317 typedef enum { E8559831c_val } E8559831c;
    318 enum { E8559831d_val } value_d;
    319 
    320 void test_8559831_a(enum E8559831a value);
    321 void test_8559831(enum E8559831b value_a, E8559831c value_c) {
    322   test_8559831_a(value_a); // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
    323   enum E8559831a a1 = value_a; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
    324   a1 = value_a; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
    325 
    326   test_8559831_a(E8559831b_val); // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
    327   enum E8559831a a1a = E8559831b_val; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
    328   a1 = E8559831b_val; // expected-warning{{implicit conversion from enumeration type 'enum E8559831b' to different enumeration type 'enum E8559831a'}}
    329 
    330   test_8559831_a(value_c); // expected-warning{{implicit conversion from enumeration type 'E8559831c' to different enumeration type 'enum E8559831a'}}
    331   enum E8559831a a2 = value_c; // expected-warning{{implicit conversion from enumeration type 'E8559831c' to different enumeration type 'enum E8559831a'}}
    332   a2 = value_c; // expected-warning{{implicit conversion from enumeration type 'E8559831c' to different enumeration type 'enum E8559831a'}}
    333 
    334    test_8559831_a(value_d);
    335    enum E8559831a a3 = value_d;
    336    a3 = value_d;
    337 }
    338 
    339 void test26(int si, long sl) {
    340   si = sl % sl; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}
    341   si = sl % si;
    342   si = si % sl;
    343   si = si / sl;
    344   si = sl / si; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}
    345 }
    346