1b98a0c7fSRoman Lebedev // RUN: %clang -x c -fsanitize=implicit-integer-sign-change -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
2b98a0c7fSRoman Lebedev // RUN: %clang -x c -fsanitize=implicit-integer-sign-change -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
3b98a0c7fSRoman Lebedev // RUN: %clang -x c -fsanitize=implicit-integer-sign-change -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
4b98a0c7fSRoman Lebedev // RUN: %clang -x c -fsanitize=implicit-integer-sign-change -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
5b98a0c7fSRoman Lebedev
6*2ce71b2cSMartin Storsjö // RUN: %clangxx -x c++ -fsanitize=implicit-integer-sign-change -O0 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
7*2ce71b2cSMartin Storsjö // RUN: %clangxx -x c++ -fsanitize=implicit-integer-sign-change -O1 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
8*2ce71b2cSMartin Storsjö // RUN: %clangxx -x c++ -fsanitize=implicit-integer-sign-change -O2 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
9*2ce71b2cSMartin Storsjö // RUN: %clangxx -x c++ -fsanitize=implicit-integer-sign-change -O3 %s -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK
10b98a0c7fSRoman Lebedev
test_unsigned()11b98a0c7fSRoman Lebedev void test_unsigned() {
12b98a0c7fSRoman Lebedev unsigned char x;
13b98a0c7fSRoman Lebedev
14b98a0c7fSRoman Lebedev x = 0;
15b98a0c7fSRoman Lebedev x++;
16b98a0c7fSRoman Lebedev x = 0;
17b98a0c7fSRoman Lebedev ++x;
18b98a0c7fSRoman Lebedev
19b98a0c7fSRoman Lebedev x = 0;
20b98a0c7fSRoman Lebedev x--;
21b98a0c7fSRoman Lebedev // CHECK: {{.*}}integer-sign-change-incdec.c:[[@LINE-1]]:4: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
22b98a0c7fSRoman Lebedev x = 0;
23b98a0c7fSRoman Lebedev --x;
24b98a0c7fSRoman Lebedev // CHECK: {{.*}}integer-sign-change-incdec.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
25b98a0c7fSRoman Lebedev
26b98a0c7fSRoman Lebedev x = 1;
27b98a0c7fSRoman Lebedev x++;
28b98a0c7fSRoman Lebedev x = 1;
29b98a0c7fSRoman Lebedev ++x;
30b98a0c7fSRoman Lebedev
31b98a0c7fSRoman Lebedev x = 1;
32b98a0c7fSRoman Lebedev x--;
33b98a0c7fSRoman Lebedev x = 1;
34b98a0c7fSRoman Lebedev --x;
35b98a0c7fSRoman Lebedev
36b98a0c7fSRoman Lebedev x = 254;
37b98a0c7fSRoman Lebedev x++;
38b98a0c7fSRoman Lebedev x = 254;
39b98a0c7fSRoman Lebedev ++x;
40b98a0c7fSRoman Lebedev
41b98a0c7fSRoman Lebedev x = 254;
42b98a0c7fSRoman Lebedev x--;
43b98a0c7fSRoman Lebedev x = 254;
44b98a0c7fSRoman Lebedev --x;
45b98a0c7fSRoman Lebedev
46b98a0c7fSRoman Lebedev x = 255;
47b98a0c7fSRoman Lebedev x++;
48b98a0c7fSRoman Lebedev x = 255;
49b98a0c7fSRoman Lebedev ++x;
50b98a0c7fSRoman Lebedev
51b98a0c7fSRoman Lebedev x = 255;
52b98a0c7fSRoman Lebedev x--;
53b98a0c7fSRoman Lebedev x = 255;
54b98a0c7fSRoman Lebedev --x;
55b98a0c7fSRoman Lebedev }
56b98a0c7fSRoman Lebedev
test_signed()57b98a0c7fSRoman Lebedev void test_signed() {
58b98a0c7fSRoman Lebedev signed char x;
59b98a0c7fSRoman Lebedev
60b98a0c7fSRoman Lebedev x = -128;
61b98a0c7fSRoman Lebedev x++;
62b98a0c7fSRoman Lebedev x = -128;
63b98a0c7fSRoman Lebedev ++x;
64b98a0c7fSRoman Lebedev
65b98a0c7fSRoman Lebedev x = -128;
66b98a0c7fSRoman Lebedev x--;
67b98a0c7fSRoman Lebedev // CHECK: {{.*}}integer-sign-change-incdec.c:[[@LINE-1]]:4: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'signed char' changed the value to 127 (8-bit, signed)
68b98a0c7fSRoman Lebedev x = -128;
69b98a0c7fSRoman Lebedev --x;
70b98a0c7fSRoman Lebedev // CHECK: {{.*}}integer-sign-change-incdec.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'signed char' changed the value to 127 (8-bit, signed)
71b98a0c7fSRoman Lebedev
72b98a0c7fSRoman Lebedev x = -1;
73b98a0c7fSRoman Lebedev x++;
74b98a0c7fSRoman Lebedev x = -1;
75b98a0c7fSRoman Lebedev ++x;
76b98a0c7fSRoman Lebedev
77b98a0c7fSRoman Lebedev x = -1;
78b98a0c7fSRoman Lebedev x--;
79b98a0c7fSRoman Lebedev x = -1;
80b98a0c7fSRoman Lebedev --x;
81b98a0c7fSRoman Lebedev
82b98a0c7fSRoman Lebedev x = 0;
83b98a0c7fSRoman Lebedev x++;
84b98a0c7fSRoman Lebedev x = 0;
85b98a0c7fSRoman Lebedev ++x;
86b98a0c7fSRoman Lebedev
87b98a0c7fSRoman Lebedev x = 0;
88b98a0c7fSRoman Lebedev x--;
89b98a0c7fSRoman Lebedev x = 0;
90b98a0c7fSRoman Lebedev --x;
91b98a0c7fSRoman Lebedev
92b98a0c7fSRoman Lebedev x = 1;
93b98a0c7fSRoman Lebedev x++;
94b98a0c7fSRoman Lebedev x = 1;
95b98a0c7fSRoman Lebedev ++x;
96b98a0c7fSRoman Lebedev
97b98a0c7fSRoman Lebedev x = 1;
98b98a0c7fSRoman Lebedev x--;
99b98a0c7fSRoman Lebedev x = 1;
100b98a0c7fSRoman Lebedev --x;
101b98a0c7fSRoman Lebedev
102b98a0c7fSRoman Lebedev x = 127;
103b98a0c7fSRoman Lebedev x++;
104b98a0c7fSRoman Lebedev // CHECK: {{.*}}integer-sign-change-incdec.c:[[@LINE-1]]:4: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'signed char' changed the value to -128 (8-bit, signed)
105b98a0c7fSRoman Lebedev x = 127;
106b98a0c7fSRoman Lebedev ++x;
107b98a0c7fSRoman Lebedev // CHECK: {{.*}}integer-sign-change-incdec.c:[[@LINE-1]]:3: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'signed char' changed the value to -128 (8-bit, signed)
108b98a0c7fSRoman Lebedev
109b98a0c7fSRoman Lebedev x = 127;
110b98a0c7fSRoman Lebedev x--;
111b98a0c7fSRoman Lebedev x = 127;
112b98a0c7fSRoman Lebedev --x;
113b98a0c7fSRoman Lebedev }
114b98a0c7fSRoman Lebedev
main()115b98a0c7fSRoman Lebedev int main() {
116b98a0c7fSRoman Lebedev test_unsigned();
117b98a0c7fSRoman Lebedev test_signed();
118b98a0c7fSRoman Lebedev
119b98a0c7fSRoman Lebedev return 0;
120b98a0c7fSRoman Lebedev }
121