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