xref: /llvm-project/compiler-rt/test/ubsan/TestCases/ImplicitConversion/integer-sign-change-incdec.c (revision 2ce71b2c18301ce14e113f42af00982ac7002ed5)
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