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