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