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