[clang-cl] Ignore /Wv and /Wv:17 flags
[llvm-project.git] / clang / test / Sema / cast.c
blob1b7519eb87ebcca625be2fb46316ee5ec1153db0
1 // RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify
3 typedef struct { unsigned long bits[(((1) + (64) - 1) / (64))]; } cpumask_t;
4 cpumask_t x;
5 void foo(void) {
6 (void)x;
8 void bar(void) {
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}}
15 long bar1(long *next) {
16 return (long)(*next)++;
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;
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;
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')}}
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
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;
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;
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;
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;
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;
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;
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;
153 void testVoidPtr(VoidPtr v) {
154 (void)(Bool) v;
155 (void) (Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'VoidPtr' (aka 'void *')}}
156 (void) (Long) v;
157 (void) (VoidPtr) v;
158 (void) (CharPtr) v;
159 // Test that casts to void* can be controlled separately
160 // from other -Wpointer-to-int-cast warnings.
161 #pragma clang diagnostic push
162 #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast"
163 (void)(Int) v; // no-warning
164 #pragma clang diagnostic pop
167 void testCharPtr(CharPtr v) {
168 (void)(Bool) v;
169 (void) (Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'CharPtr' (aka 'char *')}}
170 (void) (Long) v;
171 (void) (VoidPtr) v;
172 (void) (CharPtr) v;
173 // Test that casts to void* can be controlled separately
174 // from other -Wpointer-to-int-cast warnings.
175 #pragma clang diagnostic push
176 #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast"
177 (void)(Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'CharPtr' (aka 'char *')}}
178 #pragma clang diagnostic pop
181 typedef enum { x_a, x_b } X;
182 void *intToPointerCast2(X x) {
183 return (void*)x;
186 void *intToPointerCast3(void) {
187 return (void*)(1 + 3);
190 void voidPointerToEnumCast(VoidPtr v) {
191 (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'VoidPtr' (aka 'void *')}}
192 // Test that casts to void* can be controlled separately
193 // from other -Wpointer-to-enum-cast warnings.
194 #pragma clang diagnostic push
195 #pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast"
196 (void)(X) v; // no-warning
197 #pragma clang diagnostic pop
200 void pointerToEnumCast(CharPtr v) {
201 (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'CharPtr' (aka 'char *')}}
202 // Test that casts to void* can be controlled separately
203 // from other -Wpointer-to-enum-cast warnings.
204 #pragma clang diagnostic push
205 #pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast"
206 (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'CharPtr' (aka 'char *')}}
207 #pragma clang diagnostic pop