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 | |