annotate gcc/testsuite/c-c++-common/builtin-arith-overflow-2.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR c/68120 - can't easily deal with integer overflow at compile time */
kono
parents:
diff changeset
2 /* { dg-do run } */
kono
parents:
diff changeset
3 /* { dg-additional-options "-Wno-long-long" } */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
4 /* { dg-skip-if "Program too big" { "avr-*-* pdp11*-*-*" } } */
111
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 #define SCHAR_MAX __SCHAR_MAX__
kono
parents:
diff changeset
7 #define SHRT_MAX __SHRT_MAX__
kono
parents:
diff changeset
8 #define INT_MAX __INT_MAX__
kono
parents:
diff changeset
9 #define LONG_MAX __LONG_MAX__
kono
parents:
diff changeset
10 #define LLONG_MAX __LONG_LONG_MAX__
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 #define SCHAR_MIN (-__SCHAR_MAX__ - 1)
kono
parents:
diff changeset
13 #define SHRT_MIN (-__SHRT_MAX__ - 1)
kono
parents:
diff changeset
14 #define INT_MIN (-__INT_MAX__ - 1)
kono
parents:
diff changeset
15 #define LONG_MIN (-__LONG_MAX__ - 1)
kono
parents:
diff changeset
16 #define LLONG_MIN (-__LONG_LONG_MAX__ - 1)
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 #define UCHAR_MAX (SCHAR_MAX * 2U + 1)
kono
parents:
diff changeset
19 #define USHRT_MAX (SHRT_MAX * 2U + 1)
kono
parents:
diff changeset
20 #define UINT_MAX (INT_MAX * 2U + 1)
kono
parents:
diff changeset
21 #define ULONG_MAX (LONG_MAX * 2LU + 1)
kono
parents:
diff changeset
22 #define ULLONG_MAX (LLONG_MAX * 2LLU + 1)
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 #define USCHAR_MIN (-__USCHAR_MAX__ - 1)
kono
parents:
diff changeset
25 #define USHRT_MIN (-__USHRT_MAX__ - 1)
kono
parents:
diff changeset
26 #define UINT_MIN (-__UINT_MAX__ - 1)
kono
parents:
diff changeset
27 #define ULONG_MIN (-__ULONG_MAX__ - 1)
kono
parents:
diff changeset
28 #define ULLONG_MIN (-__ULONG_LONG_MAX__ - 1)
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 /* Number of failed runtime assertions. */
kono
parents:
diff changeset
31 int nfails;
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 void __attribute__ ((noclone, noinline))
kono
parents:
diff changeset
34 runtime_assert (int expr, int line)
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 if (!expr)
kono
parents:
diff changeset
37 {
kono
parents:
diff changeset
38 __builtin_printf ("line %i: assertion failed\n", line);
kono
parents:
diff changeset
39 ++nfails;
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41 }
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 /* Helper macros for run-time testing. */
kono
parents:
diff changeset
44 #define add(x, y) ((x) + (y))
kono
parents:
diff changeset
45 #define sadd(x, y) ((x) + (y))
kono
parents:
diff changeset
46 #define saddl(x, y) ((x) + (y))
kono
parents:
diff changeset
47 #define saddll(x, y) ((x) + (y))
kono
parents:
diff changeset
48 #define uadd(x, y) ((x) + (y))
kono
parents:
diff changeset
49 #define uaddl(x, y) ((x) + (y))
kono
parents:
diff changeset
50 #define uaddll(x, y) ((x) + (y))
kono
parents:
diff changeset
51 #define sub(x, y) ((x) - (y))
kono
parents:
diff changeset
52 #define ssub(x, y) ((x) - (y))
kono
parents:
diff changeset
53 #define ssubl(x, y) ((x) - (y))
kono
parents:
diff changeset
54 #define ssubll(x, y) ((x) - (y))
kono
parents:
diff changeset
55 #define usub(x, y) ((x) - (y))
kono
parents:
diff changeset
56 #define usubl(x, y) ((x) - (y))
kono
parents:
diff changeset
57 #define usubll(x, y) ((x) - (y))
kono
parents:
diff changeset
58 #define mul(x, y) ((x) * (y))
kono
parents:
diff changeset
59 #define smul(x, y) ((x) * (y))
kono
parents:
diff changeset
60 #define smull(x, y) ((x) * (y))
kono
parents:
diff changeset
61 #define smulll(x, y) ((x) * (y))
kono
parents:
diff changeset
62 #define umul(x, y) ((x) * (y))
kono
parents:
diff changeset
63 #define umull(x, y) ((x) * (y))
kono
parents:
diff changeset
64 #define umulll(x, y) ((x) * (y))
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 int main (void)
kono
parents:
diff changeset
67 {
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 #if __cplusplus >= 201103L
kono
parents:
diff changeset
70 # define StaticAssert(expr) static_assert ((expr), #expr)
kono
parents:
diff changeset
71 #elif __STDC_VERSION__ >= 201112L
kono
parents:
diff changeset
72 # define StaticAssert(expr) _Static_assert ((expr), #expr)
kono
parents:
diff changeset
73 #else
kono
parents:
diff changeset
74 /* The following pragma has no effect due to bug 70888 - #pragma
kono
parents:
diff changeset
75 diagnostic ignored -Wlong-long ineffective with __LONG_LONG_MAX__
kono
parents:
diff changeset
76 in c++98 mode. */
kono
parents:
diff changeset
77 # pragma GCC diagnostic ignored "-Wlong-long"
kono
parents:
diff changeset
78 # pragma GCC diagnostic ignored "-Wunused-local-typedefs"
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 # define CONCAT(a, b) a ## b
kono
parents:
diff changeset
81 # define CAT(a, b) CONCAT (a, b)
kono
parents:
diff changeset
82 # define StaticAssert(expr) \
kono
parents:
diff changeset
83 typedef int CAT (StaticAssert_, __LINE__) [1 - 2 * !(expr)]
kono
parents:
diff changeset
84 #endif
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 /* Make extra effort to prevent constant folding seeing the constant
kono
parents:
diff changeset
87 values of the arguments and optimizing the run-time test into
kono
parents:
diff changeset
88 a constant. */
kono
parents:
diff changeset
89 #define RuntimeAssert(op, T, U, x, y, vflow) \
kono
parents:
diff changeset
90 do { \
kono
parents:
diff changeset
91 volatile T a = (x), b = (y); \
kono
parents:
diff changeset
92 U c = 0; \
kono
parents:
diff changeset
93 volatile int vf = __builtin_ ## op ## _overflow (a, b, &c); \
kono
parents:
diff changeset
94 runtime_assert ((vf == vflow), __LINE__); \
kono
parents:
diff changeset
95 if (vf == 0) \
kono
parents:
diff changeset
96 runtime_assert (op (a, b) == c, __LINE__); \
kono
parents:
diff changeset
97 } while (0)
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 /* Verify that each call to the type-generic __builtin_op_overflow(x, y)
kono
parents:
diff changeset
100 yields a constant expression equal to z indicating whether or not
kono
parents:
diff changeset
101 the constant expression (x op y) overflows when evaluated in type T. */
kono
parents:
diff changeset
102 # define G_TEST(op, T, x, y, vflow) \
kono
parents:
diff changeset
103 RuntimeAssert(op, __typeof__ (op (x, y)), T, x, y, vflow); \
kono
parents:
diff changeset
104 StaticAssert ((vflow) == __builtin_ ## op ## _overflow_p ((x), (y), (T)0))
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 /* Addition. */
kono
parents:
diff changeset
107 G_TEST (add, signed char, 0, 0, 0);
kono
parents:
diff changeset
108 G_TEST (add, signed char, 0, SCHAR_MAX, 0);
kono
parents:
diff changeset
109 G_TEST (add, signed char, 1, SCHAR_MAX, 1);
kono
parents:
diff changeset
110 G_TEST (add, signed char, SCHAR_MAX, SCHAR_MAX, 1);
kono
parents:
diff changeset
111 G_TEST (add, signed char, 0, SCHAR_MIN, 0);
kono
parents:
diff changeset
112 G_TEST (add, signed char, -1, SCHAR_MIN, 1);
kono
parents:
diff changeset
113 /* Verify any slicing in the result type doesn't prevent the overflow
kono
parents:
diff changeset
114 from being detected. */
kono
parents:
diff changeset
115 G_TEST (add, signed char, UCHAR_MAX + 1, 0, 1);
kono
parents:
diff changeset
116 G_TEST (add, signed char, UCHAR_MAX + 1, 1, 1);
kono
parents:
diff changeset
117 G_TEST (add, signed char, 1, UCHAR_MAX + 1, 1);
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 G_TEST (add, unsigned char, 0, 0, 0);
kono
parents:
diff changeset
120 /* Verify any slicing in the result type doesn't prevent the overflow
kono
parents:
diff changeset
121 from being detected. */
kono
parents:
diff changeset
122 G_TEST (add, unsigned char, UCHAR_MAX + 1, 0, 1);
kono
parents:
diff changeset
123 G_TEST (add, unsigned char, UCHAR_MAX + 1, 1, 1);
kono
parents:
diff changeset
124 G_TEST (add, unsigned char, 1, UCHAR_MAX + 1, 1);
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 G_TEST (add, short, 0, 0, 0);
kono
parents:
diff changeset
127 G_TEST (add, short, 0, SHRT_MAX, 0);
kono
parents:
diff changeset
128 G_TEST (add, short, 1, SHRT_MAX, 1);
kono
parents:
diff changeset
129 G_TEST (add, short, SHRT_MAX, SHRT_MAX, 1);
kono
parents:
diff changeset
130 G_TEST (add, short, 0, SHRT_MIN, 0);
kono
parents:
diff changeset
131 G_TEST (add, short, -1, SHRT_MIN, 1);
kono
parents:
diff changeset
132 G_TEST (add, short, SHRT_MIN, SHRT_MIN, 1);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 G_TEST (add, int, 0, 0, 0);
kono
parents:
diff changeset
135 G_TEST (add, int, 0, INT_MAX, 0);
kono
parents:
diff changeset
136 G_TEST (add, int, 1, INT_MAX, 1);
kono
parents:
diff changeset
137 G_TEST (add, int, INT_MAX, INT_MAX, 1);
kono
parents:
diff changeset
138 G_TEST (add, int, 0, INT_MIN, 0);
kono
parents:
diff changeset
139 G_TEST (add, int, -1, INT_MIN, 1);
kono
parents:
diff changeset
140 G_TEST (add, int, INT_MIN, INT_MIN, 1);
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 G_TEST (add, long, 0, 0, 0);
kono
parents:
diff changeset
143 G_TEST (add, long, 0, LONG_MAX, 0);
kono
parents:
diff changeset
144 G_TEST (add, long, 1, LONG_MAX, 1);
kono
parents:
diff changeset
145 G_TEST (add, long, LONG_MAX, LONG_MAX, 1);
kono
parents:
diff changeset
146 G_TEST (add, long, 0, LONG_MIN, 0);
kono
parents:
diff changeset
147 G_TEST (add, long, -1, LONG_MIN, 1);
kono
parents:
diff changeset
148 G_TEST (add, long, LONG_MIN, LONG_MIN, 1);
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 G_TEST (add, long long, 0, 0, 0);
kono
parents:
diff changeset
151 G_TEST (add, long long, 0, LLONG_MAX, 0);
kono
parents:
diff changeset
152 G_TEST (add, long long, 1, LLONG_MAX, 1);
kono
parents:
diff changeset
153 G_TEST (add, long long, LLONG_MAX, LLONG_MAX, 1);
kono
parents:
diff changeset
154 G_TEST (add, long long, 0, LLONG_MIN, 0);
kono
parents:
diff changeset
155 G_TEST (add, long long, -1, LLONG_MIN, 1);
kono
parents:
diff changeset
156 G_TEST (add, long long, LLONG_MIN, LLONG_MIN, 1);
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 /* Subtraction */
kono
parents:
diff changeset
159 G_TEST (sub, unsigned char, 0, 0, 0);
kono
parents:
diff changeset
160 G_TEST (sub, unsigned char, 0, UCHAR_MAX, 1);
kono
parents:
diff changeset
161 G_TEST (sub, unsigned char, 1, UCHAR_MAX, 1);
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 G_TEST (sub, unsigned char, UCHAR_MAX, UCHAR_MAX, 0);
kono
parents:
diff changeset
164 G_TEST (sub, unsigned short, 0, 0, 0);
kono
parents:
diff changeset
165 G_TEST (sub, unsigned short, 0, USHRT_MAX, 1);
kono
parents:
diff changeset
166 G_TEST (sub, unsigned short, 1, USHRT_MAX, 1);
kono
parents:
diff changeset
167 G_TEST (sub, unsigned short, USHRT_MAX, USHRT_MAX, 0);
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 G_TEST (sub, unsigned, 0, 0, 0);
kono
parents:
diff changeset
170 G_TEST (sub, unsigned, 0, UINT_MAX, 1);
kono
parents:
diff changeset
171 G_TEST (sub, unsigned, 1, UINT_MAX, 1);
kono
parents:
diff changeset
172 G_TEST (sub, unsigned, UINT_MAX, UINT_MAX, 0);
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 G_TEST (sub, unsigned long, 0, 0, 0);
kono
parents:
diff changeset
175 G_TEST (sub, unsigned long, 0, ULONG_MAX, 1);
kono
parents:
diff changeset
176 G_TEST (sub, unsigned long, 1, ULONG_MAX, 1);
kono
parents:
diff changeset
177 G_TEST (sub, unsigned long, ULONG_MAX, ULONG_MAX, 0);
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 G_TEST (sub, unsigned long long, 0, 0, 0);
kono
parents:
diff changeset
180 G_TEST (sub, unsigned long long, 0, ULLONG_MAX, 1);
kono
parents:
diff changeset
181 G_TEST (sub, unsigned long long, 1, ULLONG_MAX, 1);
kono
parents:
diff changeset
182 G_TEST (sub, unsigned long long, ULLONG_MAX, ULLONG_MAX, 0);
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 G_TEST (sub, signed char, 0, 0, 0);
kono
parents:
diff changeset
185 G_TEST (sub, signed char, 0, SCHAR_MAX, 0);
kono
parents:
diff changeset
186 G_TEST (sub, signed char, 1, SCHAR_MAX, 0);
kono
parents:
diff changeset
187 G_TEST (sub, signed char, SCHAR_MAX, SCHAR_MAX, 0);
kono
parents:
diff changeset
188 G_TEST (sub, signed char, SCHAR_MIN, 1, 1);
kono
parents:
diff changeset
189 G_TEST (sub, signed char, 0, SCHAR_MIN, 1);
kono
parents:
diff changeset
190 G_TEST (sub, signed char, -1, SCHAR_MIN, 0);
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 G_TEST (sub, short, 0, 0, 0);
kono
parents:
diff changeset
193 G_TEST (sub, short, 0, SHRT_MAX, 0);
kono
parents:
diff changeset
194 G_TEST (sub, short, 1, SHRT_MAX, 0);
kono
parents:
diff changeset
195 G_TEST (sub, short, SHRT_MAX, SHRT_MAX, 0);
kono
parents:
diff changeset
196 G_TEST (sub, short, 0, SHRT_MIN, 1);
kono
parents:
diff changeset
197 G_TEST (sub, short, -1, SHRT_MIN, 0);
kono
parents:
diff changeset
198 G_TEST (sub, short, SHRT_MIN, SHRT_MIN, 0);
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 G_TEST (sub, int, 0, 0, 0);
kono
parents:
diff changeset
201 G_TEST (sub, int, 0, INT_MAX, 0);
kono
parents:
diff changeset
202 G_TEST (sub, int, 1, INT_MAX, 0);
kono
parents:
diff changeset
203 G_TEST (sub, int, INT_MAX, INT_MAX, 0);
kono
parents:
diff changeset
204 G_TEST (sub, int, 0, INT_MIN, 1);
kono
parents:
diff changeset
205 G_TEST (sub, int, -1, INT_MIN, 0);
kono
parents:
diff changeset
206 G_TEST (sub, int, INT_MIN, INT_MIN, 0);
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 G_TEST (sub, long, 0, 0, 0);
kono
parents:
diff changeset
209 G_TEST (sub, long, 0, LONG_MAX, 0);
kono
parents:
diff changeset
210 G_TEST (sub, long, 1, LONG_MAX, 0);
kono
parents:
diff changeset
211 G_TEST (sub, long, LONG_MAX, LONG_MAX, 0);
kono
parents:
diff changeset
212 G_TEST (sub, long, 0, LONG_MIN, 1);
kono
parents:
diff changeset
213 G_TEST (sub, long, -1, LONG_MIN, 0);
kono
parents:
diff changeset
214 G_TEST (sub, long, LONG_MIN, LONG_MIN, 0);
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 G_TEST (sub, long long, 0, 0, 0);
kono
parents:
diff changeset
217 G_TEST (sub, long long, 0, LLONG_MAX, 0);
kono
parents:
diff changeset
218 G_TEST (sub, long long, 1, LLONG_MAX, 0);
kono
parents:
diff changeset
219 G_TEST (sub, long long, LLONG_MAX, LLONG_MAX, 0);
kono
parents:
diff changeset
220 G_TEST (sub, long long, 0, LLONG_MIN, 1);
kono
parents:
diff changeset
221 G_TEST (sub, long long, -1, LLONG_MIN, 0);
kono
parents:
diff changeset
222 G_TEST (sub, long long, LLONG_MIN, LLONG_MIN, 0);
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 G_TEST (sub, unsigned char, 0, 0, 0);
kono
parents:
diff changeset
225 G_TEST (sub, unsigned char, 0, UCHAR_MAX, 1);
kono
parents:
diff changeset
226 G_TEST (sub, unsigned char, 1, UCHAR_MAX, 1);
kono
parents:
diff changeset
227 G_TEST (sub, unsigned char, UCHAR_MAX, UCHAR_MAX, 0);
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 G_TEST (sub, unsigned short, 0, 0, 0);
kono
parents:
diff changeset
230 G_TEST (sub, unsigned short, 0, USHRT_MAX, 1);
kono
parents:
diff changeset
231 G_TEST (sub, unsigned short, 1, USHRT_MAX, 1);
kono
parents:
diff changeset
232 G_TEST (sub, unsigned short, USHRT_MAX, USHRT_MAX, 0);
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 G_TEST (sub, unsigned, 0, 0, 0);
kono
parents:
diff changeset
235 G_TEST (sub, unsigned, 0, UINT_MAX, 1);
kono
parents:
diff changeset
236 G_TEST (sub, unsigned, 1, UINT_MAX, 1);
kono
parents:
diff changeset
237 G_TEST (sub, unsigned, UINT_MAX, UINT_MAX, 0);
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 G_TEST (sub, unsigned long, 0, 0, 0);
kono
parents:
diff changeset
240 G_TEST (sub, unsigned long, 0, ULONG_MAX, 1);
kono
parents:
diff changeset
241 G_TEST (sub, unsigned long, 1, ULONG_MAX, 1);
kono
parents:
diff changeset
242 G_TEST (sub, unsigned long, ULONG_MAX, ULONG_MAX, 0);
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 G_TEST (sub, unsigned long long, 0, 0, 0);
kono
parents:
diff changeset
245 G_TEST (sub, unsigned long long, 0, ULLONG_MAX, 1);
kono
parents:
diff changeset
246 G_TEST (sub, unsigned long long, 1, ULLONG_MAX, 1);
kono
parents:
diff changeset
247 G_TEST (sub, unsigned long long, ULLONG_MAX, ULLONG_MAX, 0);
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 /* Multiplication. */
kono
parents:
diff changeset
250 G_TEST (mul, unsigned char, 0, 0, 0);
kono
parents:
diff changeset
251 G_TEST (mul, unsigned char, 0, UCHAR_MAX, 0);
kono
parents:
diff changeset
252 G_TEST (mul, unsigned char, 1, UCHAR_MAX, 0);
kono
parents:
diff changeset
253 G_TEST (mul, unsigned char, 2, UCHAR_MAX, 1);
kono
parents:
diff changeset
254 G_TEST (mul, unsigned char, UCHAR_MAX, UCHAR_MAX, 1);
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 G_TEST (mul, unsigned short, 0, 0, 0);
kono
parents:
diff changeset
257 G_TEST (mul, unsigned short, 0, USHRT_MAX, 0);
kono
parents:
diff changeset
258 G_TEST (mul, unsigned short, 1, USHRT_MAX, 0);
kono
parents:
diff changeset
259 G_TEST (mul, unsigned short, USHRT_MAX, 2, 1);
kono
parents:
diff changeset
260 G_TEST (mul, unsigned short, USHRT_MAX, USHRT_MAX, 1);
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 G_TEST (mul, unsigned, 0, 0, 0);
kono
parents:
diff changeset
263 G_TEST (mul, unsigned, 0, UINT_MAX, 0);
kono
parents:
diff changeset
264 G_TEST (mul, unsigned, 1, UINT_MAX, 0);
kono
parents:
diff changeset
265 G_TEST (mul, unsigned, 2, UINT_MAX, 1);
kono
parents:
diff changeset
266 G_TEST (mul, unsigned, UINT_MAX, UINT_MAX, 1);
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 G_TEST (mul, unsigned long, 0, 0, 0);
kono
parents:
diff changeset
269 G_TEST (mul, unsigned long, 0, ULONG_MAX, 0);
kono
parents:
diff changeset
270 G_TEST (mul, unsigned long, 1, ULONG_MAX, 0);
kono
parents:
diff changeset
271 G_TEST (mul, unsigned long, 2, ULONG_MAX, 1);
kono
parents:
diff changeset
272 G_TEST (mul, unsigned long, ULONG_MAX, ULONG_MAX, 1);
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 G_TEST (mul, unsigned long long, 0, 0, 0);
kono
parents:
diff changeset
275 G_TEST (mul, unsigned long long, 0, ULLONG_MAX, 0);
kono
parents:
diff changeset
276 G_TEST (mul, unsigned long long, 1, ULLONG_MAX, 0);
kono
parents:
diff changeset
277 G_TEST (mul, unsigned long long, 2, ULLONG_MAX, 1);
kono
parents:
diff changeset
278 G_TEST (mul, unsigned long long, ULLONG_MAX, ULLONG_MAX, 1);
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 G_TEST (mul, signed char, 0, 0, 0);
kono
parents:
diff changeset
281 G_TEST (mul, signed char, 0, SCHAR_MAX, 0);
kono
parents:
diff changeset
282 G_TEST (mul, signed char, 1, SCHAR_MAX, 0);
kono
parents:
diff changeset
283 G_TEST (mul, signed char, SCHAR_MAX, SCHAR_MAX, 1);
kono
parents:
diff changeset
284 G_TEST (mul, signed char, SCHAR_MIN, 1, 0);
kono
parents:
diff changeset
285 G_TEST (mul, signed char, 0, SCHAR_MIN, 0);
kono
parents:
diff changeset
286 G_TEST (mul, signed char, -1, SCHAR_MIN, 1);
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 G_TEST (mul, short, 0, 0, 0);
kono
parents:
diff changeset
289 G_TEST (mul, short, 0, SHRT_MAX, 0);
kono
parents:
diff changeset
290 G_TEST (mul, short, 1, SHRT_MAX, 0);
kono
parents:
diff changeset
291 G_TEST (mul, short, SHRT_MAX, SHRT_MAX, 1);
kono
parents:
diff changeset
292 G_TEST (mul, short, 0, SHRT_MIN, 0);
kono
parents:
diff changeset
293 G_TEST (mul, short, -1, SHRT_MIN, 1);
kono
parents:
diff changeset
294 G_TEST (mul, short, SHRT_MIN, SHRT_MIN, 1);
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 G_TEST (mul, int, 0, 0, 0);
kono
parents:
diff changeset
297 G_TEST (mul, int, 0, INT_MAX, 0);
kono
parents:
diff changeset
298 G_TEST (mul, int, 1, INT_MAX, 0);
kono
parents:
diff changeset
299 G_TEST (mul, int, INT_MAX, INT_MAX, 1);
kono
parents:
diff changeset
300 G_TEST (mul, int, 0, INT_MIN, 0);
kono
parents:
diff changeset
301 G_TEST (mul, int, -1, INT_MIN, 1);
kono
parents:
diff changeset
302 G_TEST (mul, int, INT_MIN, INT_MIN, 1);
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 G_TEST (mul, long, 0, 0, 0);
kono
parents:
diff changeset
305 G_TEST (mul, long, 0, LONG_MAX, 0);
kono
parents:
diff changeset
306 G_TEST (mul, long, 1, LONG_MAX, 0);
kono
parents:
diff changeset
307 G_TEST (mul, long, LONG_MAX, LONG_MAX, 1);
kono
parents:
diff changeset
308 G_TEST (mul, long, 0, LONG_MIN, 0);
kono
parents:
diff changeset
309 G_TEST (mul, long, -1, LONG_MIN, 1);
kono
parents:
diff changeset
310 G_TEST (mul, long, LONG_MIN, LONG_MIN, 1);
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 G_TEST (mul, long long, 0, 0, 0);
kono
parents:
diff changeset
313 G_TEST (mul, long long, 0, LLONG_MAX, 0);
kono
parents:
diff changeset
314 G_TEST (mul, long long, 1, LLONG_MAX, 0);
kono
parents:
diff changeset
315 G_TEST (mul, long long, LLONG_MAX, LLONG_MAX, 1);
kono
parents:
diff changeset
316 G_TEST (mul, long long, 0, LLONG_MIN, 0);
kono
parents:
diff changeset
317 G_TEST (mul, long long, -1, LLONG_MIN, 1);
kono
parents:
diff changeset
318 G_TEST (mul, long long, LLONG_MIN, LLONG_MIN, 1);
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 G_TEST (mul, unsigned char, 0, 0, 0);
kono
parents:
diff changeset
321 G_TEST (mul, unsigned char, 0, UCHAR_MAX, 0);
kono
parents:
diff changeset
322 G_TEST (mul, unsigned char, 1, UCHAR_MAX, 0);
kono
parents:
diff changeset
323 G_TEST (mul, unsigned char, UCHAR_MAX, UCHAR_MAX, 1);
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 G_TEST (mul, unsigned short, 0, 0, 0);
kono
parents:
diff changeset
326 G_TEST (mul, unsigned short, 0, USHRT_MAX, 0);
kono
parents:
diff changeset
327 G_TEST (mul, unsigned short, 1, USHRT_MAX, 0);
kono
parents:
diff changeset
328 G_TEST (mul, unsigned short, USHRT_MAX, USHRT_MAX, 1);
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 G_TEST (mul, unsigned, 0, 0, 0);
kono
parents:
diff changeset
331 G_TEST (mul, unsigned, 0, UINT_MAX, 0);
kono
parents:
diff changeset
332 G_TEST (mul, unsigned, 1, UINT_MAX, 0);
kono
parents:
diff changeset
333 G_TEST (mul, unsigned, UINT_MAX, UINT_MAX, 1);
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 G_TEST (mul, unsigned long, 0, 0, 0);
kono
parents:
diff changeset
336 G_TEST (mul, unsigned long, 0, ULONG_MAX, 0);
kono
parents:
diff changeset
337 G_TEST (mul, unsigned long, 1, ULONG_MAX, 0);
kono
parents:
diff changeset
338 G_TEST (mul, unsigned long, ULONG_MAX, ULONG_MAX, 1);
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 G_TEST (mul, unsigned long long, 0, 0, 0);
kono
parents:
diff changeset
341 G_TEST (mul, unsigned long long, 0, ULLONG_MAX, 0);
kono
parents:
diff changeset
342 G_TEST (mul, unsigned long long, 1, ULLONG_MAX, 0);
kono
parents:
diff changeset
343 G_TEST (mul, unsigned long long, ULLONG_MAX, ULLONG_MAX, 1);
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 /* Verify that each call to the type-specific __builtin_op_overflow
kono
parents:
diff changeset
346 evaluates to a (not-necessarily constant) expression indicating
kono
parents:
diff changeset
347 whether or not the constant expression (x op y) overflows.
kono
parents:
diff changeset
348 The type-specific forms of the built-ins detect overflow after
kono
parents:
diff changeset
349 arithmetic promotions and so unlike the type-generic overloads
kono
parents:
diff changeset
350 cannot detect overflow in char or short types. */
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 #define T_TEST(op, T, x, y, vflow) \
kono
parents:
diff changeset
353 RuntimeAssert (op, T, __typeof__ ((x) + (y)), x, y, vflow)
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 /* Signed int addition. */
kono
parents:
diff changeset
356 T_TEST (sadd, signed char, 0, 0, 0);
kono
parents:
diff changeset
357 T_TEST (sadd, signed char, 0, SCHAR_MAX, 0);
kono
parents:
diff changeset
358 T_TEST (sadd, signed char, 1, SCHAR_MAX, 0);
kono
parents:
diff changeset
359 T_TEST (sadd, signed char, SCHAR_MAX, SCHAR_MAX, 0);
kono
parents:
diff changeset
360 T_TEST (sadd, signed char, 0, SCHAR_MIN, 0);
kono
parents:
diff changeset
361 T_TEST (sadd, signed char, -1, SCHAR_MIN, 0);
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 T_TEST (sadd, short, 0, 0, 0);
kono
parents:
diff changeset
364 T_TEST (sadd, short, 0, SHRT_MAX, 0);
kono
parents:
diff changeset
365 T_TEST (sadd, short, 1, SHRT_MAX, 0);
kono
parents:
diff changeset
366 T_TEST (sadd, short, SHRT_MAX, SHRT_MAX, 0);
kono
parents:
diff changeset
367 T_TEST (sadd, short, 0, SHRT_MIN, 0);
kono
parents:
diff changeset
368 T_TEST (sadd, short, -1, SHRT_MIN, 0);
kono
parents:
diff changeset
369 T_TEST (sadd, short, SHRT_MIN, SHRT_MIN, 0);
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 T_TEST (sadd, int, 0, 0, 0);
kono
parents:
diff changeset
372 T_TEST (sadd, int, 0, INT_MAX, 0);
kono
parents:
diff changeset
373 T_TEST (sadd, int, 1, INT_MAX, 1);
kono
parents:
diff changeset
374 T_TEST (sadd, int, INT_MAX, INT_MAX, 1);
kono
parents:
diff changeset
375 T_TEST (sadd, int, 0, INT_MIN, 0);
kono
parents:
diff changeset
376 T_TEST (sadd, int, -1, INT_MIN, 1);
kono
parents:
diff changeset
377 T_TEST (sadd, int, INT_MIN, INT_MIN, 1);
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 /* Signed long addition. */
kono
parents:
diff changeset
380 T_TEST (saddl, long, 0L, 0L, 0);
kono
parents:
diff changeset
381 T_TEST (saddl, long, 0L, LONG_MAX, 0);
kono
parents:
diff changeset
382 T_TEST (saddl, long, 1L, LONG_MAX, 1);
kono
parents:
diff changeset
383 T_TEST (saddl, long, LONG_MAX, LONG_MAX, 1);
kono
parents:
diff changeset
384 T_TEST (saddl, long, 0L, LONG_MIN, 0);
kono
parents:
diff changeset
385 T_TEST (saddl, long, -1L, LONG_MIN, 1);
kono
parents:
diff changeset
386 T_TEST (saddl, long, LONG_MIN, LONG_MIN, 1);
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 T_TEST (saddll, long long, 0LL, 0LL, 0);
kono
parents:
diff changeset
389 T_TEST (saddll, long long, 0LL, LLONG_MAX, 0);
kono
parents:
diff changeset
390 T_TEST (saddll, long long, 1LL, LLONG_MAX, 1);
kono
parents:
diff changeset
391 T_TEST (saddll, long long, LLONG_MAX, LLONG_MAX, 1);
kono
parents:
diff changeset
392 T_TEST (saddll, long long, 0LL, LLONG_MIN, 0);
kono
parents:
diff changeset
393 T_TEST (saddll, long long, -1LL, LLONG_MIN, 1);
kono
parents:
diff changeset
394 T_TEST (saddll, long long, LLONG_MIN, LLONG_MIN, 1);
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 /* Unsigned int addition. */
kono
parents:
diff changeset
397 T_TEST (uadd, unsigned char, 0U, 0U, 0);
kono
parents:
diff changeset
398 T_TEST (uadd, unsigned char, 0U, UCHAR_MAX, 0);
kono
parents:
diff changeset
399 T_TEST (uadd, unsigned char, 1U, UCHAR_MAX, 0);
kono
parents:
diff changeset
400 T_TEST (uadd, unsigned char, UCHAR_MAX, UCHAR_MAX, 0);
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 T_TEST (uadd, unsigned short, 0U, 0U, 0);
kono
parents:
diff changeset
403 T_TEST (uadd, unsigned short, 0U, USHRT_MAX, 0);
kono
parents:
diff changeset
404 T_TEST (uadd, unsigned short, 1U, USHRT_MAX, 0);
kono
parents:
diff changeset
405 T_TEST (uadd, unsigned short, USHRT_MAX, USHRT_MAX, 0);
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 T_TEST (uadd, unsigned, 0U, 0U, 0);
kono
parents:
diff changeset
408 T_TEST (uadd, unsigned, 0U, UINT_MAX, 0);
kono
parents:
diff changeset
409 T_TEST (uadd, unsigned, 1U, UINT_MAX, 1);
kono
parents:
diff changeset
410 T_TEST (uadd, unsigned, UINT_MAX, UINT_MAX, 1);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 /* Unsigned long addition. */
kono
parents:
diff changeset
413 T_TEST (uaddl, unsigned long, 0UL, 0UL, 0);
kono
parents:
diff changeset
414 T_TEST (uaddl, unsigned long, 0UL, ULONG_MAX, 0);
kono
parents:
diff changeset
415 T_TEST (uaddl, unsigned long, 1UL, ULONG_MAX, 1);
kono
parents:
diff changeset
416 T_TEST (uaddl, unsigned long, ULONG_MAX, ULONG_MAX, 1);
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 T_TEST (uaddll, unsigned long long, 0ULL, 0ULL, 0);
kono
parents:
diff changeset
419 T_TEST (uaddll, unsigned long long, 0ULL, ULLONG_MAX, 0);
kono
parents:
diff changeset
420 T_TEST (uaddll, unsigned long long, 1ULL, ULLONG_MAX, 1);
kono
parents:
diff changeset
421 T_TEST (uaddll, unsigned long long, ULLONG_MAX, ULLONG_MAX, 1);
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 /* Signed int subtraction. */
kono
parents:
diff changeset
424 T_TEST (ssub, signed char, 0, 0, 0);
kono
parents:
diff changeset
425 T_TEST (ssub, signed char, 0, SCHAR_MAX, 0);
kono
parents:
diff changeset
426 T_TEST (ssub, signed char, 1, SCHAR_MAX, 0);
kono
parents:
diff changeset
427 T_TEST (ssub, signed char, SCHAR_MAX, SCHAR_MAX, 0);
kono
parents:
diff changeset
428 T_TEST (ssub, signed char, 0, SCHAR_MIN, 0);
kono
parents:
diff changeset
429 T_TEST (ssub, signed char, -1, SCHAR_MIN, 0);
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 T_TEST (ssub, short, 0, 0, 0);
kono
parents:
diff changeset
432 T_TEST (ssub, short, 0, SHRT_MAX, 0);
kono
parents:
diff changeset
433 T_TEST (ssub, short, 1, SHRT_MAX, 0);
kono
parents:
diff changeset
434 T_TEST (ssub, short, SHRT_MAX, SHRT_MAX, 0);
kono
parents:
diff changeset
435 T_TEST (ssub, short, 0, SHRT_MIN, 0);
kono
parents:
diff changeset
436 T_TEST (ssub, short, -1, SHRT_MIN, 0);
kono
parents:
diff changeset
437 T_TEST (ssub, short, SHRT_MIN, SHRT_MIN, 0);
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 T_TEST (ssub, int, 0, 0, 0);
kono
parents:
diff changeset
440 T_TEST (ssub, int, 0, INT_MAX, 0);
kono
parents:
diff changeset
441 T_TEST (ssub, int, 1, INT_MAX, 0);
kono
parents:
diff changeset
442 T_TEST (ssub, int, INT_MAX, INT_MAX, 0);
kono
parents:
diff changeset
443 T_TEST (ssub, int, 0, INT_MIN, 1);
kono
parents:
diff changeset
444 T_TEST (ssub, int, -1, INT_MIN, 0);
kono
parents:
diff changeset
445 T_TEST (ssub, int, INT_MIN, INT_MIN, 0);
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 /* Signed long subtraction. */
kono
parents:
diff changeset
448 T_TEST (ssubl, long, 0L, 0L, 0);
kono
parents:
diff changeset
449 T_TEST (ssubl, long, 0L, LONG_MAX, 0);
kono
parents:
diff changeset
450 T_TEST (ssubl, long, 1L, LONG_MAX, 0);
kono
parents:
diff changeset
451 T_TEST (ssubl, long, LONG_MAX, LONG_MAX, 0);
kono
parents:
diff changeset
452 T_TEST (ssubl, long, 0L, LONG_MIN, 1);
kono
parents:
diff changeset
453 T_TEST (ssubl, long, -1L, LONG_MIN, 0);
kono
parents:
diff changeset
454 T_TEST (ssubl, long, LONG_MIN, LONG_MIN, 0);
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 /* Signed long long subtraction. */
kono
parents:
diff changeset
457 T_TEST (ssubll, long long, 0LL, 0LL, 0);
kono
parents:
diff changeset
458 T_TEST (ssubll, long long, 0LL, LLONG_MAX, 0);
kono
parents:
diff changeset
459 T_TEST (ssubll, long long, 1LL, LLONG_MAX, 0);
kono
parents:
diff changeset
460 T_TEST (ssubll, long long, LLONG_MAX, LLONG_MAX, 0);
kono
parents:
diff changeset
461 T_TEST (ssubll, long long, 0LL, LLONG_MIN, 1);
kono
parents:
diff changeset
462 T_TEST (ssubll, long long, -1LL, LLONG_MIN, 0);
kono
parents:
diff changeset
463 T_TEST (ssubll, long long, LLONG_MIN, LLONG_MIN, 0);
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 /* Unsigned int subtraction. */
kono
parents:
diff changeset
466 T_TEST (usub, unsigned char, 0U, 0U, 0);
kono
parents:
diff changeset
467 T_TEST (usub, unsigned char, 0U, UCHAR_MAX, 1);
kono
parents:
diff changeset
468 T_TEST (usub, unsigned char, 1U, UCHAR_MAX, 1);
kono
parents:
diff changeset
469 T_TEST (usub, unsigned char, UCHAR_MAX, UCHAR_MAX, 0);
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 T_TEST (usub, unsigned short, 0U, 0U, 0);
kono
parents:
diff changeset
472 T_TEST (usub, unsigned short, 0U, USHRT_MAX, 1);
kono
parents:
diff changeset
473 T_TEST (usub, unsigned short, 1U, USHRT_MAX, 1);
kono
parents:
diff changeset
474 T_TEST (usub, unsigned short, USHRT_MAX, USHRT_MAX, 0);
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 T_TEST (usub, unsigned, 0U, 0U, 0);
kono
parents:
diff changeset
477 T_TEST (usub, unsigned, 0U, UINT_MAX, 1);
kono
parents:
diff changeset
478 T_TEST (usub, unsigned, 1U, UINT_MAX, 1);
kono
parents:
diff changeset
479 T_TEST (usub, unsigned, UINT_MAX, UINT_MAX, 0);
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 /* Unsigned long subtraction. */
kono
parents:
diff changeset
482 T_TEST (usubl, unsigned long, 0UL, 0UL, 0);
kono
parents:
diff changeset
483 T_TEST (usubl, unsigned long, 0UL, ULONG_MAX, 1);
kono
parents:
diff changeset
484 T_TEST (usubl, unsigned long, 1UL, ULONG_MAX, 1);
kono
parents:
diff changeset
485 T_TEST (usubl, unsigned long, ULONG_MAX, ULONG_MAX, 0);
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 /* Unsigned long long subtraction. */
kono
parents:
diff changeset
488 T_TEST (usubll, unsigned long long, 0ULL, 0ULL, 0);
kono
parents:
diff changeset
489 T_TEST (usubll, unsigned long long, 0ULL, ULLONG_MAX, 1);
kono
parents:
diff changeset
490 T_TEST (usubll, unsigned long long, 1ULL, ULLONG_MAX, 1);
kono
parents:
diff changeset
491 T_TEST (usubll, unsigned long long, ULLONG_MAX, ULLONG_MAX, 0);
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 return 0;
kono
parents:
diff changeset
494 }