1// RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify
2
3typedef struct { unsigned long bits[(((1) + (64) - 1) / (64))]; } cpumask_t;
4cpumask_t x;
5void foo() {
6  (void)x;
7}
8void 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
15long bar1(long *next) {
16        return (long)(*next)++;
17}
18
19typedef _Bool Bool;
20typedef int Int;
21typedef long Long;
22typedef float Float;
23typedef double Double;
24typedef _Complex int CInt;
25typedef _Complex long CLong;
26typedef _Complex float CFloat;
27typedef _Complex double CDouble;
28typedef void *VoidPtr;
29typedef char *CharPtr;
30
31void 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
45void 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
67void 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
81void 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
93void 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
105void 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
117void 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
129void 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
141void 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
153void 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
161void 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
169typedef enum { x_a, x_b } X;
170void *intToPointerCast2(X x) {
171  return (void*)x;
172}
173
174void *intToPointerCast3() {
175  return (void*)(1 + 3);
176}
177