conversion.c 14 KB

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