1 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV0 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
2 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
3 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
4 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
5 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV4 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
6 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
7 // RUN: %clang   -x c   -fsanitize=implicit-integer-sign-change %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
8 
9 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV0 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
10 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
11 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
12 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
13 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV4 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
14 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
15 // RUN: %clang   -x c++ -fsanitize=implicit-integer-sign-change %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
16 
17 #include <stdint.h>
18 
19 // Test plan:
20 //  * Two types - int and char
21 //  * Two signs - signed and unsigned
22 //  * Square that - we have input and output types.
23 // Thus, there are total of (2*2)^2 == 16 tests.
24 // These are all the possible variations/combinations of casts.
25 // However, not all of them should result in the check.
26 // So here, we *only* check which should and which should not result in checks.
27 
28 //============================================================================//
29 // Half of the cases do not need the check.                                   //
30 //============================================================================//
31 
negative0_convert_unsigned_int_to_unsigned_int(uint32_t x)32 uint32_t negative0_convert_unsigned_int_to_unsigned_int(uint32_t x) {
33   return x;
34 }
35 
negative1_convert_unsigned_char_to_unsigned_char(uint8_t x)36 uint8_t negative1_convert_unsigned_char_to_unsigned_char(uint8_t x) {
37   return x;
38 }
39 
negative2_convert_signed_int_to_signed_int(int32_t x)40 int32_t negative2_convert_signed_int_to_signed_int(int32_t x) {
41   return x;
42 }
43 
negative3_convert_signed_char_to_signed_char(int8_t x)44 int8_t negative3_convert_signed_char_to_signed_char(int8_t x) {
45   return x;
46 }
47 
negative4_convert_unsigned_int_to_unsigned_char(uint32_t x)48 uint8_t negative4_convert_unsigned_int_to_unsigned_char(uint32_t x) {
49   return x;
50 }
51 
negative5_convert_unsigned_char_to_unsigned_int(uint8_t x)52 uint32_t negative5_convert_unsigned_char_to_unsigned_int(uint8_t x) {
53   return x;
54 }
55 
negative6_convert_unsigned_char_to_signed_int(uint8_t x)56 int32_t negative6_convert_unsigned_char_to_signed_int(uint8_t x) {
57   return x;
58 }
59 
negative7_convert_signed_char_to_signed_int(int8_t x)60 int32_t negative7_convert_signed_char_to_signed_int(int8_t x) {
61   return x;
62 }
63 
test_negatives()64 void test_negatives() {
65   // No bits set.
66   negative0_convert_unsigned_int_to_unsigned_int(0);
67   negative1_convert_unsigned_char_to_unsigned_char(0);
68   negative2_convert_signed_int_to_signed_int(0);
69   negative3_convert_signed_char_to_signed_char(0);
70   negative4_convert_unsigned_int_to_unsigned_char(0);
71   negative5_convert_unsigned_char_to_unsigned_int(0);
72   negative6_convert_unsigned_char_to_signed_int(0);
73   negative7_convert_signed_char_to_signed_int(0);
74 
75   // One lowest bit set.
76   negative0_convert_unsigned_int_to_unsigned_int(1);
77   negative1_convert_unsigned_char_to_unsigned_char(1);
78   negative2_convert_signed_int_to_signed_int(1);
79   negative3_convert_signed_char_to_signed_char(1);
80   negative4_convert_unsigned_int_to_unsigned_char(1);
81   negative5_convert_unsigned_char_to_unsigned_int(1);
82   negative6_convert_unsigned_char_to_signed_int(1);
83   negative7_convert_signed_char_to_signed_int(1);
84 
85   // All source bits set.
86   negative0_convert_unsigned_int_to_unsigned_int((uint32_t)UINT32_MAX);
87   negative1_convert_unsigned_char_to_unsigned_char((uint8_t)UINT8_MAX);
88   negative2_convert_signed_int_to_signed_int((int32_t)INT32_MAX);
89   negative3_convert_signed_char_to_signed_char((int8_t)INT8_MAX);
90   negative4_convert_unsigned_int_to_unsigned_char((uint32_t)UINT32_MAX);
91   negative5_convert_unsigned_char_to_unsigned_int((uint8_t)UINT8_MAX);
92   negative6_convert_unsigned_char_to_signed_int((uint8_t)UINT8_MAX);
93   negative7_convert_signed_char_to_signed_int((int8_t)INT8_MAX);
94 
95   // Source 'sign' bit set.
96   negative0_convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MIN);
97   negative1_convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MIN);
98   negative2_convert_signed_int_to_signed_int((int32_t)INT32_MIN);
99   negative3_convert_signed_char_to_signed_char((int8_t)INT8_MIN);
100   negative4_convert_unsigned_int_to_unsigned_char((uint32_t)INT32_MIN);
101   negative5_convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MIN);
102   negative6_convert_unsigned_char_to_signed_int((uint8_t)INT8_MIN);
103   negative7_convert_signed_char_to_signed_int((int8_t)INT8_MIN);
104 }
105 
106 //============================================================================//
107 // The remaining 8 cases *do* need the check.   //
108 //============================================================================//
109 
positive0_convert_unsigned_int_to_signed_int(uint32_t x)110 int32_t positive0_convert_unsigned_int_to_signed_int(uint32_t x) {
111 #line 100
112   return x;
113 }
114 
positive1_convert_signed_int_to_unsigned_int(int32_t x)115 uint32_t positive1_convert_signed_int_to_unsigned_int(int32_t x) {
116 #line 200
117   return x;
118 }
119 
positive2_convert_signed_int_to_unsigned_char(int32_t x)120 uint8_t positive2_convert_signed_int_to_unsigned_char(int32_t x) {
121 #line 300
122   return x;
123 }
124 
positive3_convert_signed_char_to_unsigned_char(int8_t x)125 uint8_t positive3_convert_signed_char_to_unsigned_char(int8_t x) {
126 #line 400
127   return x;
128 }
129 
positive4_convert_unsigned_char_to_signed_char(uint8_t x)130 int8_t positive4_convert_unsigned_char_to_signed_char(uint8_t x) {
131 #line 500
132   return x;
133 }
134 
positive5_convert_signed_char_to_unsigned_int(int8_t x)135 uint32_t positive5_convert_signed_char_to_unsigned_int(int8_t x) {
136 #line 600
137   return x;
138 }
139 
positive6_convert_unsigned_int_to_signed_char(uint32_t x)140 int8_t positive6_convert_unsigned_int_to_signed_char(uint32_t x) {
141 #line 700
142   return x;
143 }
144 
positive7_convert_signed_int_to_signed_char(int32_t x)145 int8_t positive7_convert_signed_int_to_signed_char(int32_t x) {
146 #line 800
147   return x;
148 }
149 
150 #line 1120 // !!!
151 
test_positives()152 void test_positives() {
153   // No bits set.
154   positive0_convert_unsigned_int_to_signed_int(0);
155   positive1_convert_signed_int_to_unsigned_int(0);
156   positive2_convert_signed_int_to_unsigned_char(0);
157   positive3_convert_signed_char_to_unsigned_char(0);
158   positive4_convert_unsigned_char_to_signed_char(0);
159   positive5_convert_signed_char_to_unsigned_int(0);
160   positive6_convert_unsigned_int_to_signed_char(0);
161   positive7_convert_signed_int_to_signed_char(0);
162 
163   // One lowest bit set.
164   positive0_convert_unsigned_int_to_signed_int(1);
165   positive1_convert_signed_int_to_unsigned_int(1);
166   positive2_convert_signed_int_to_unsigned_char(1);
167   positive3_convert_signed_char_to_unsigned_char(1);
168   positive4_convert_unsigned_char_to_signed_char(1);
169   positive5_convert_signed_char_to_unsigned_int(1);
170   positive6_convert_unsigned_int_to_signed_char(1);
171   positive7_convert_signed_int_to_signed_char(1);
172 
173 #if defined(V0)
174   // All source bits set.
175   positive0_convert_unsigned_int_to_signed_int((uint32_t)UINT32_MAX);
176 // CHECK-V0: {{.*}}integer-sign-change.c:100:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type '{{.*}}' (aka 'int') changed the value to -1 (32-bit, signed)
177   positive1_convert_signed_int_to_unsigned_int((int32_t)UINT32_MAX);
178 // CHECK-V0: {{.*}}integer-sign-change.c:200:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -1 (32-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 4294967295 (32-bit, unsigned)
179   positive2_convert_signed_int_to_unsigned_char((int32_t)UINT32_MAX);
180 // CHECK-V0: {{.*}}integer-sign-change.c:300:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -1 (32-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 255 (8-bit, unsigned)
181   positive3_convert_signed_char_to_unsigned_char((int8_t)UINT8_MAX);
182 // CHECK-V0: {{.*}}integer-sign-change.c:400:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -1 (8-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 255 (8-bit, unsigned)
183   positive4_convert_unsigned_char_to_signed_char((uint8_t)UINT8_MAX);
184 // CHECK-V0: {{.*}}integer-sign-change.c:500:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned char') of value 255 (8-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
185   positive5_convert_signed_char_to_unsigned_int((int8_t)UINT8_MAX);
186 // CHECK-V0: {{.*}}integer-sign-change.c:600:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -1 (8-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 4294967295 (32-bit, unsigned)
187   positive6_convert_unsigned_int_to_signed_char((uint32_t)UINT32_MAX);
188 // CHECK-V0: {{.*}}integer-sign-change.c:700:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
189   positive7_convert_signed_int_to_signed_char((int32_t)UINT32_MAX);
190 #elif defined(V1)
191   // Source 'Sign' bit set.
192   positive0_convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
193 // CHECK-V1: {{.*}}integer-sign-change.c:100:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 2147483648 (32-bit, unsigned) to type '{{.*}}' (aka 'int') changed the value to -2147483648 (32-bit, signed)
194   positive1_convert_signed_int_to_unsigned_int((int32_t)INT32_MIN);
195 // CHECK-V1: {{.*}}integer-sign-change.c:200:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483648 (32-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 2147483648 (32-bit, unsigned)
196   positive2_convert_signed_int_to_unsigned_char((int32_t)INT32_MIN);
197 // CHECK-V1: {{.*}}integer-sign-change.c:300:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483648 (32-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 0 (8-bit, unsigned)
198   positive3_convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
199 // CHECK-V1: {{.*}}integer-sign-change.c:400:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -128 (8-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 128 (8-bit, unsigned)
200   positive4_convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
201 // CHECK-V1: {{.*}}integer-sign-change.c:500:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned char') of value 128 (8-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -128 (8-bit, signed)
202   positive5_convert_signed_char_to_unsigned_int((int8_t)INT8_MIN);
203 // CHECK-V1: {{.*}}integer-sign-change.c:600:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -128 (8-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 4294967168 (32-bit, unsigned)
204   positive6_convert_unsigned_int_to_signed_char((uint32_t)INT32_MIN);
205   positive7_convert_signed_int_to_signed_char((int32_t)INT32_MIN);
206 // CHECK-V1: {{.*}}integer-sign-change.c:800:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483648 (32-bit, signed) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to 0 (8-bit, signed)
207 #elif defined(V2)
208   // All bits except the source 'Sign' bit are set.
209   positive0_convert_unsigned_int_to_signed_int((uint32_t)INT32_MAX);
210   positive1_convert_signed_int_to_unsigned_int((int32_t)INT32_MAX);
211   positive2_convert_signed_int_to_unsigned_char((int32_t)INT32_MAX);
212   positive3_convert_signed_char_to_unsigned_char((int8_t)INT8_MAX);
213   positive4_convert_unsigned_char_to_signed_char((uint8_t)INT8_MAX);
214   positive5_convert_signed_char_to_unsigned_int((int8_t)INT8_MAX);
215   positive6_convert_unsigned_int_to_signed_char((uint32_t)INT32_MAX);
216 // CHECK-V2: {{.*}}integer-sign-change.c:700:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 2147483647 (32-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
217   positive7_convert_signed_int_to_signed_char((int32_t)INT32_MAX);
218 // CHECK-V2: {{.*}}integer-sign-change.c:800:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value 2147483647 (32-bit, signed) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
219 #elif defined(V3)
220   // All destination bits set.
221   positive0_convert_unsigned_int_to_signed_int((uint32_t)UINT32_MAX);
222 // CHECK-V3: {{.*}}integer-sign-change.c:100:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type '{{.*}}' (aka 'int') changed the value to -1 (32-bit, signed)
223   positive1_convert_signed_int_to_unsigned_int((int32_t)UINT32_MAX);
224 // CHECK-V3: {{.*}}integer-sign-change.c:200:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -1 (32-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 4294967295 (32-bit, unsigned)
225   positive2_convert_signed_int_to_unsigned_char((int32_t)UINT8_MAX);
226   positive3_convert_signed_char_to_unsigned_char((int8_t)UINT8_MAX);
227 // CHECK-V3: {{.*}}integer-sign-change.c:400:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -1 (8-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 255 (8-bit, unsigned)
228   positive4_convert_unsigned_char_to_signed_char((uint8_t)UINT8_MAX);
229 // CHECK-V3: {{.*}}integer-sign-change.c:500:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned char') of value 255 (8-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
230   positive5_convert_signed_char_to_unsigned_int((int8_t)UINT32_MAX);
231 // CHECK-V3: {{.*}}integer-sign-change.c:600:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -1 (8-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 4294967295 (32-bit, unsigned)
232   positive6_convert_unsigned_int_to_signed_char((uint32_t)UINT8_MAX);
233 // CHECK-V3: {{.*}}integer-sign-change.c:700:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 255 (32-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
234   positive7_convert_signed_int_to_signed_char((int32_t)UINT8_MAX);
235 // CHECK-V3: {{.*}}integer-sign-change.c:800:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value 255 (32-bit, signed) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -1 (8-bit, signed)
236 #elif defined(V4)
237   // Destination 'sign' bit set.
238   positive0_convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
239 // CHECK-V4: {{.*}}integer-sign-change.c:100:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 2147483648 (32-bit, unsigned) to type '{{.*}}' (aka 'int') changed the value to -2147483648 (32-bit, signed)
240   positive1_convert_signed_int_to_unsigned_int((int32_t)INT32_MIN);
241 // CHECK-V4: {{.*}}integer-sign-change.c:200:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483648 (32-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 2147483648 (32-bit, unsigned)
242   positive2_convert_signed_int_to_unsigned_char((int32_t)INT8_MIN);
243 // CHECK-V4: {{.*}}integer-sign-change.c:300:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -128 (32-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 128 (8-bit, unsigned)
244   positive3_convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
245 // CHECK-V4: {{.*}}integer-sign-change.c:400:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -128 (8-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 128 (8-bit, unsigned)
246   positive4_convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
247 // CHECK-V4: {{.*}}integer-sign-change.c:500:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned char') of value 128 (8-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -128 (8-bit, signed)
248   positive5_convert_signed_char_to_unsigned_int((int8_t)INT32_MIN);
249   positive6_convert_unsigned_int_to_signed_char((uint32_t)INT8_MIN);
250 // CHECK-V4: {{.*}}integer-sign-change.c:700:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 4294967168 (32-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -128 (8-bit, signed)
251   positive7_convert_signed_int_to_signed_char((int32_t)INT8_MIN);
252 #elif defined(V5)
253   // All bits except the destination 'sign' bit are set.
254   positive0_convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
255 // CHECK-V5: {{.*}}integer-sign-change.c:100:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 2147483648 (32-bit, unsigned) to type '{{.*}}' (aka 'int') changed the value to -2147483648 (32-bit, signed)
256   positive1_convert_signed_int_to_unsigned_int((int32_t)INT32_MIN);
257 // CHECK-V5: {{.*}}integer-sign-change.c:200:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483648 (32-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 2147483648 (32-bit, unsigned)
258   positive2_convert_signed_int_to_unsigned_char((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
259 // CHECK-V5: {{.*}}integer-sign-change.c:300:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -129 (32-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 127 (8-bit, unsigned)
260   positive3_convert_signed_char_to_unsigned_char((int8_t)(INT8_MIN));
261 // CHECK-V5: {{.*}}integer-sign-change.c:400:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -128 (8-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 128 (8-bit, unsigned)
262   positive4_convert_unsigned_char_to_signed_char((uint8_t)(INT8_MIN));
263 // CHECK-V5: {{.*}}integer-sign-change.c:500:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned char') of value 128 (8-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -128 (8-bit, signed)
264   positive5_convert_signed_char_to_unsigned_int((int8_t)(INT32_MIN));
265   positive6_convert_unsigned_int_to_signed_char(~((uint32_t)(uint8_t)INT8_MIN));
266   positive7_convert_signed_int_to_signed_char((int32_t)(~((uint32_t)((uint8_t)INT8_MIN))));
267 // CHECK-V5: {{.*}}integer-sign-change.c:800:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -129 (32-bit, signed) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to 127 (8-bit, signed)
268 #elif defined(V6)
269   // Only the source and destination sign bits are set.
270   positive0_convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
271 // CHECK-V6: {{.*}}integer-sign-change.c:100:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 2147483648 (32-bit, unsigned) to type '{{.*}}' (aka 'int') changed the value to -2147483648 (32-bit, signed)
272   positive1_convert_signed_int_to_unsigned_int((int32_t)INT32_MIN);
273 // CHECK-V6: {{.*}}integer-sign-change.c:200:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483648 (32-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 2147483648 (32-bit, unsigned)
274   positive2_convert_signed_int_to_unsigned_char((int32_t)((uint32_t)INT32_MIN | (uint32_t)((uint8_t)INT8_MIN)));
275 // CHECK-V6: {{.*}}integer-sign-change.c:300:10: runtime error: implicit conversion from type '{{.*}}' (aka 'int') of value -2147483520 (32-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 128 (8-bit, unsigned)
276   positive3_convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
277 // CHECK-V6: {{.*}}integer-sign-change.c:400:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -128 (8-bit, signed) to type '{{.*}}' (aka 'unsigned char') changed the value to 128 (8-bit, unsigned)
278   positive4_convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
279 // CHECK-V6: {{.*}}integer-sign-change.c:500:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned char') of value 128 (8-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -128 (8-bit, signed)
280   positive5_convert_signed_char_to_unsigned_int((int8_t)INT8_MIN);
281 // CHECK-V6: {{.*}}integer-sign-change.c:600:10: runtime error: implicit conversion from type '{{.*}}' (aka '{{(signed )?}}char') of value -128 (8-bit, signed) to type '{{.*}}' (aka 'unsigned int') changed the value to 4294967168 (32-bit, unsigned)
282   positive6_convert_unsigned_int_to_signed_char((uint32_t)((uint32_t)INT32_MIN | (uint32_t)((uint8_t)INT8_MIN)));
283 // CHECK-V6: {{.*}}integer-sign-change.c:700:10: runtime error: implicit conversion from type '{{.*}}' (aka 'unsigned int') of value 2147483776 (32-bit, unsigned) to type '{{.*}}' (aka '{{(signed )?}}char') changed the value to -128 (8-bit, signed)
284   positive7_convert_signed_int_to_signed_char((int32_t)((uint32_t)INT32_MIN | (uint32_t)((uint8_t)INT8_MIN)));
285 #else
286 #error Some V* needs to be defined!
287 #endif
288 }
289 
290 // CHECK-NOT: implicit conversion
291 
main()292 int main() {
293   test_negatives();
294   test_positives();
295 
296   return 0;
297 }
298