xref: /aosp_15_r20/external/clang/test/Sema/cast.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify
2*67e74705SXin Li 
3*67e74705SXin Li typedef struct { unsigned long bits[(((1) + (64) - 1) / (64))]; } cpumask_t;
4*67e74705SXin Li cpumask_t x;
foo()5*67e74705SXin Li void foo() {
6*67e74705SXin Li   (void)x;
7*67e74705SXin Li }
bar()8*67e74705SXin Li void bar() {
9*67e74705SXin Li   char* a;
10*67e74705SXin Li   double b;
11*67e74705SXin Li   b = (double)a; // expected-error {{pointer cannot be cast to type}}
12*67e74705SXin Li   a = (char*)b; // expected-error {{cannot be cast to a pointer type}}
13*67e74705SXin Li }
14*67e74705SXin Li 
bar1(long * next)15*67e74705SXin Li long bar1(long *next) {
16*67e74705SXin Li         return (long)(*next)++;
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li typedef _Bool Bool;
20*67e74705SXin Li typedef int Int;
21*67e74705SXin Li typedef long Long;
22*67e74705SXin Li typedef float Float;
23*67e74705SXin Li typedef double Double;
24*67e74705SXin Li typedef _Complex int CInt;
25*67e74705SXin Li typedef _Complex long CLong;
26*67e74705SXin Li typedef _Complex float CFloat;
27*67e74705SXin Li typedef _Complex double CDouble;
28*67e74705SXin Li typedef void *VoidPtr;
29*67e74705SXin Li typedef char *CharPtr;
30*67e74705SXin Li 
testBool(Bool v)31*67e74705SXin Li void testBool(Bool v) {
32*67e74705SXin Li   (void) (Bool) v;
33*67e74705SXin Li   (void) (Int) v;
34*67e74705SXin Li   (void) (Long) v;
35*67e74705SXin Li   (void) (Float) v;
36*67e74705SXin Li   (void) (Double) v;
37*67e74705SXin Li   (void) (CInt) v;
38*67e74705SXin Li   (void) (CLong) v;
39*67e74705SXin Li   (void) (CFloat) v;
40*67e74705SXin Li   (void) (CDouble) v;
41*67e74705SXin Li   (void) (VoidPtr) v;
42*67e74705SXin Li   (void) (CharPtr) v;
43*67e74705SXin Li }
44*67e74705SXin Li 
testInt(Int v)45*67e74705SXin Li void testInt(Int v) {
46*67e74705SXin Li   (void) (Bool) v;
47*67e74705SXin Li   (void) (Int) v;
48*67e74705SXin Li   (void) (Long) v;
49*67e74705SXin Li   (void) (Float) v;
50*67e74705SXin Li   (void) (Double) v;
51*67e74705SXin Li   (void) (CInt) v;
52*67e74705SXin Li   (void) (CLong) v;
53*67e74705SXin Li   (void) (CFloat) v;
54*67e74705SXin Li   (void) (CDouble) v;
55*67e74705SXin Li   (void) (VoidPtr) v; // expected-warning{{cast to 'VoidPtr' (aka 'void *') from smaller integer type 'Int' (aka 'int')}}
56*67e74705SXin Li   (void) (CharPtr) v; // expected-warning{{cast to 'CharPtr' (aka 'char *') from smaller integer type 'Int' (aka 'int')}}
57*67e74705SXin Li 
58*67e74705SXin Li   // Test that casts to void* can be controlled separately
59*67e74705SXin Li   // from other -Wint-to-pointer-cast warnings.
60*67e74705SXin Li #pragma clang diagnostic push
61*67e74705SXin Li #pragma clang diagnostic ignored "-Wint-to-void-pointer-cast"
62*67e74705SXin Li   (void) (VoidPtr) v; // no-warning
63*67e74705SXin Li   (void) (CharPtr) v; // expected-warning{{cast to 'CharPtr' (aka 'char *') from smaller integer type 'Int' (aka 'int')}}
64*67e74705SXin Li #pragma clang diagnostic pop
65*67e74705SXin Li }
66*67e74705SXin Li 
testLong(Long v)67*67e74705SXin Li void testLong(Long v) {
68*67e74705SXin Li   (void) (Bool) v;
69*67e74705SXin Li   (void) (Int) v;
70*67e74705SXin Li   (void) (Long) v;
71*67e74705SXin Li   (void) (Float) v;
72*67e74705SXin Li   (void) (Double) v;
73*67e74705SXin Li   (void) (CInt) v;
74*67e74705SXin Li   (void) (CLong) v;
75*67e74705SXin Li   (void) (CFloat) v;
76*67e74705SXin Li   (void) (CDouble) v;
77*67e74705SXin Li   (void) (VoidPtr) v;
78*67e74705SXin Li   (void) (CharPtr) v;
79*67e74705SXin Li }
80*67e74705SXin Li 
testFloat(Float v)81*67e74705SXin Li void testFloat(Float v) {
82*67e74705SXin Li   (void) (Bool) v;
83*67e74705SXin Li   (void) (Int) v;
84*67e74705SXin Li   (void) (Long) v;
85*67e74705SXin Li   (void) (Float) v;
86*67e74705SXin Li   (void) (Double) v;
87*67e74705SXin Li   (void) (CInt) v;
88*67e74705SXin Li   (void) (CLong) v;
89*67e74705SXin Li   (void) (CFloat) v;
90*67e74705SXin Li   (void) (CDouble) v;
91*67e74705SXin Li }
92*67e74705SXin Li 
testDouble(Double v)93*67e74705SXin Li void testDouble(Double v) {
94*67e74705SXin Li   (void) (Bool) v;
95*67e74705SXin Li   (void) (Int) v;
96*67e74705SXin Li   (void) (Long) v;
97*67e74705SXin Li   (void) (Float) v;
98*67e74705SXin Li   (void) (Double) v;
99*67e74705SXin Li   (void) (CInt) v;
100*67e74705SXin Li   (void) (CLong) v;
101*67e74705SXin Li   (void) (CFloat) v;
102*67e74705SXin Li   (void) (CDouble) v;
103*67e74705SXin Li }
104*67e74705SXin Li 
testCI(CInt v)105*67e74705SXin Li void testCI(CInt v) {
106*67e74705SXin Li   (void) (Bool) v;
107*67e74705SXin Li   (void) (Int) v;
108*67e74705SXin Li   (void) (Long) v;
109*67e74705SXin Li   (void) (Float) v;
110*67e74705SXin Li   (void) (Double) v;
111*67e74705SXin Li   (void) (CInt) v;
112*67e74705SXin Li   (void) (CLong) v;
113*67e74705SXin Li   (void) (CFloat) v;
114*67e74705SXin Li   (void) (CDouble) v;
115*67e74705SXin Li }
116*67e74705SXin Li 
testCLong(CLong v)117*67e74705SXin Li void testCLong(CLong v) {
118*67e74705SXin Li   (void) (Bool) v;
119*67e74705SXin Li   (void) (Int) v;
120*67e74705SXin Li   (void) (Long) v;
121*67e74705SXin Li   (void) (Float) v;
122*67e74705SXin Li   (void) (Double) v;
123*67e74705SXin Li   (void) (CInt) v;
124*67e74705SXin Li   (void) (CLong) v;
125*67e74705SXin Li   (void) (CFloat) v;
126*67e74705SXin Li   (void) (CDouble) v;
127*67e74705SXin Li }
128*67e74705SXin Li 
testCFloat(CFloat v)129*67e74705SXin Li void testCFloat(CFloat v) {
130*67e74705SXin Li   (void) (Bool) v;
131*67e74705SXin Li   (void) (Int) v;
132*67e74705SXin Li   (void) (Long) v;
133*67e74705SXin Li   (void) (Float) v;
134*67e74705SXin Li   (void) (Double) v;
135*67e74705SXin Li   (void) (CInt) v;
136*67e74705SXin Li   (void) (CLong) v;
137*67e74705SXin Li   (void) (CFloat) v;
138*67e74705SXin Li   (void) (CDouble) v;
139*67e74705SXin Li }
140*67e74705SXin Li 
testCDouble(CDouble v)141*67e74705SXin Li void testCDouble(CDouble v) {
142*67e74705SXin Li   (void) (Bool) v;
143*67e74705SXin Li   (void) (Int) v;
144*67e74705SXin Li   (void) (Long) v;
145*67e74705SXin Li   (void) (Float) v;
146*67e74705SXin Li   (void) (Double) v;
147*67e74705SXin Li   (void) (CInt) v;
148*67e74705SXin Li   (void) (CLong) v;
149*67e74705SXin Li   (void) (CFloat) v;
150*67e74705SXin Li   (void) (CDouble) v;
151*67e74705SXin Li }
152*67e74705SXin Li 
testVoidPtr(VoidPtr v)153*67e74705SXin Li void testVoidPtr(VoidPtr v) {
154*67e74705SXin Li   (void) (Bool) v;
155*67e74705SXin Li   (void) (Int) v;
156*67e74705SXin Li   (void) (Long) v;
157*67e74705SXin Li   (void) (VoidPtr) v;
158*67e74705SXin Li   (void) (CharPtr) v;
159*67e74705SXin Li }
160*67e74705SXin Li 
testCharPtr(CharPtr v)161*67e74705SXin Li void testCharPtr(CharPtr v) {
162*67e74705SXin Li   (void) (Bool) v;
163*67e74705SXin Li   (void) (Int) v;
164*67e74705SXin Li   (void) (Long) v;
165*67e74705SXin Li   (void) (VoidPtr) v;
166*67e74705SXin Li   (void) (CharPtr) v;
167*67e74705SXin Li }
168*67e74705SXin Li 
169*67e74705SXin Li typedef enum { x_a, x_b } X;
intToPointerCast2(X x)170*67e74705SXin Li void *intToPointerCast2(X x) {
171*67e74705SXin Li   return (void*)x;
172*67e74705SXin Li }
173*67e74705SXin Li 
intToPointerCast3()174*67e74705SXin Li void *intToPointerCast3() {
175*67e74705SXin Li   return (void*)(1 + 3);
176*67e74705SXin Li }
177