1/*
2 * Copyright (c) 2006 Apple Computer, Inc.  All rights reserved.
3 */
4
5#ifndef __CHECKINT_H__
6#define __CHECKINT_H__
7
8/* ObjC++ Guard */
9#if defined(__OBJC__) && defined(__cplusplus)
10#error "checkint.h does not support Objective C++"
11#elif defined(__cplusplus)
12#error "checkint.h does not support C++"
13#endif
14
15#include <stdint.h>
16#include <limits.h>
17
18__BEGIN_DECLS
19
20enum {
21	CHECKINT_NO_ERROR = 0,
22	CHECKINT_OVERFLOW_ERROR = (1 << 0),
23	CHECKINT_TYPE_ERROR = (1 << 1)
24};
25
26#define check_int32_add(x, y, err)		__checkint_int32_add(x,y,err)
27#define check_uint32_add(x, y, err)		__checkint_uint32_add(x,y,err)
28#define check_int64_add(x, y, err)		__checkint_int64_add(x,y,err)
29#define check_uint64_add(x, y, err)		__checkint_uint64_add(x,y,err)
30
31#define check_int32_sub(x, y, err)		__checkint_int32_sub(x,y,err)
32#define check_uint32_sub(x, y, err)		__checkint_uint32_sub(x,y,err)
33#define check_int64_sub(x, y, err)		__checkint_int64_sub(x,y,err)
34#define check_uint64_sub(x, y, err)		__checkint_uint64_sub(x,y,err)
35
36#define check_int32_mul(x, y, err)		__checkint_int32_mul(x,y,err)
37#define check_uint32_mul(x, y, err)		__checkint_uint32_mul(x,y,err)
38#define check_int64_mul(x, y, err)		__checkint_int64_mul(x,y,err)
39#define check_uint64_mul(x, y, err)		__checkint_uint64_mul(x,y,err)
40
41#define check_int32_div(x, y, err)		__checkint_int32_div(x,y,err)
42#define check_uint32_div(x, y, err)		__checkint_uint32_div(x,y,err)
43#define check_int64_div(x, y, err)		__checkint_int64_div(x,y,err)
44#define check_uint64_div(x, y, err)		__checkint_uint64_div(x,y,err)
45
46/***
47 * Private Interfaces
48 *
49 * Please do not directly use any interfaces below this point.  They are
50 * considered an implementation detail of the above, supported, interfaces
51 * and are subject to change at any time without warning.
52 ***/
53
54#define __CHECKINT_INLINE static inline __attribute__((always_inline))
55
56__CHECKINT_INLINE int32_t
57__checkint_is_mixed_sign32(int32_t x, int32_t y) {return ((x ^ y) < 0);}
58
59__CHECKINT_INLINE int32_t
60__checkint_is_mixed_sign64(int64_t x, int64_t y) {return ((x ^ y) < 0);}
61
62__CHECKINT_INLINE int32_t
63__checkint_int32_type_error(int32_t* err)  {*err |= CHECKINT_TYPE_ERROR; return -1;}
64
65__CHECKINT_INLINE int32_t
66__checkint_uint32_type_error(int32_t* err) {*err |= CHECKINT_TYPE_ERROR; return -1;}
67
68__CHECKINT_INLINE int32_t
69__checkint_int64_type_error(int32_t* err)  {*err |= CHECKINT_TYPE_ERROR; return -1;}
70
71__CHECKINT_INLINE int32_t
72__checkint_uint64_type_error(int32_t* err) {*err |= CHECKINT_TYPE_ERROR; return -1;}
73
74__CHECKINT_INLINE int32_t
75__checkint_int32_add(int64_t x, int64_t y, int32_t* err) {
76	int64_t z = x + y;
77	if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) {
78		*err |= CHECKINT_OVERFLOW_ERROR;
79	}
80	if (z > INT32_MAX || z < INT32_MIN) *err |= CHECKINT_OVERFLOW_ERROR;
81	return (int32_t)z;
82}
83
84__CHECKINT_INLINE uint32_t
85__checkint_uint32_add(int64_t x, int64_t y, int32_t* err) {
86	int64_t z = x + y;
87	if ((x & 0xffffffff00000000ull) || (y & 0xffffffff00000000ull)) *err |= CHECKINT_OVERFLOW_ERROR;
88	if (z > UINT_MAX || z < 0) *err |= CHECKINT_OVERFLOW_ERROR;
89	return (uint32_t)z;
90}
91
92__CHECKINT_INLINE int64_t
93__checkint_int64_add_signed_signed(int64_t x, int64_t y, int32_t* err) {
94	/* Mixed-sign additions cannot overflow */
95	if (__checkint_is_mixed_sign64(x,y)) {
96	/* else, both arguments negative */
97	} else if (y < 0) {
98		if (x < LLONG_MIN - y) *err |= CHECKINT_OVERFLOW_ERROR;
99	/* else, both arguments positive */
100	} else {
101		if (LLONG_MAX - x < y) *err |= CHECKINT_OVERFLOW_ERROR;
102        }
103	return x + y;
104}
105
106__CHECKINT_INLINE int64_t
107__checkint_int64_add_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
108  if(((int64_t)(LLONG_MAX - y)) < x)
109           *err = *err | CHECKINT_OVERFLOW_ERROR;
110  return x + y;
111}
112
113__CHECKINT_INLINE int64_t
114__checkint_int64_add_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
115   return __checkint_int64_add_signed_unsigned(y, x, err);
116}
117
118__CHECKINT_INLINE int64_t
119__checkint_int64_add_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
120 int64_t diff = LLONG_MAX - y;
121   if(diff < 0 || ((uint64_t) diff) < x)
122        *err = *err | CHECKINT_OVERFLOW_ERROR;
123   return x + y;
124}
125
126__CHECKINT_INLINE uint64_t
127__checkint_uint64_add_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
128   if((ULLONG_MAX - y) < x)
129        *err = *err | CHECKINT_OVERFLOW_ERROR;
130   return x + y;
131}
132
133__CHECKINT_INLINE uint64_t
134__checkint_uint64_add_signed_signed(int64_t x, int64_t y, int32_t* err) {
135  if(((x < 0 && y >= 0) || (x >= 0 && y < 0)) && (x + y) < 0)
136        *err = *err | CHECKINT_OVERFLOW_ERROR;
137  else if(x < 0 && y < 0)
138        *err = *err | CHECKINT_OVERFLOW_ERROR;
139  return x + y;
140}
141
142__CHECKINT_INLINE uint64_t
143__checkint_uint64_add_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
144  if(x > 0)
145        return __checkint_uint64_add_unsigned_unsigned(x, y, err);
146  if((y < ((uint64_t)LLONG_MAX + 1)) && (((int64_t) (x + y)) < 0))
147           *err = *err | CHECKINT_OVERFLOW_ERROR;
148  return x + y;
149}
150
151__CHECKINT_INLINE uint64_t
152__checkint_uint64_add_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
153   return __checkint_uint64_add_signed_unsigned(y, x, err);
154}
155
156__CHECKINT_INLINE int32_t
157__checkint_int32_sub(int64_t x, int64_t y, int32_t* err) {
158	if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) {
159		*err |= CHECKINT_OVERFLOW_ERROR;
160	}
161	int64_t z = x - y;
162	if (z > INT_MAX || z < INT_MIN) *err |= CHECKINT_OVERFLOW_ERROR;
163	return (int32_t)z;
164}
165
166__CHECKINT_INLINE uint32_t
167__checkint_uint32_sub(int64_t x, int64_t y, int32_t* err) {
168	int64_t z = x - y;
169	if ((x & 0xffffffff00000000ull) || (y & 0xffffffff00000000ull)) *err |= CHECKINT_OVERFLOW_ERROR;
170	if (z > UINT_MAX || z < 0) *err |= CHECKINT_OVERFLOW_ERROR;
171	return (uint32_t)z;
172}
173
174__CHECKINT_INLINE int64_t
175__checkint_int64_sub_signed_signed(int64_t x, int64_t y, int32_t* err) {
176  if(__checkint_is_mixed_sign64(x, y))
177  {
178     /* Positive x subtract a negative y */
179     if(x >= 0)
180     {
181            if(x > LLONG_MAX + y)
182                *err = *err | CHECKINT_OVERFLOW_ERROR;
183     }
184     /* Negative x subtract a positive y */
185     else
186     {
187            if(x < LLONG_MIN + y)
188                *err = *err | CHECKINT_OVERFLOW_ERROR;
189     }
190  }
191  /* Both negative, or both positive, no possible overflow */
192  return x - y;
193}
194
195__CHECKINT_INLINE int64_t
196__checkint_int64_sub_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
197  if(x < ((int64_t)(LLONG_MIN + y)))
198        *err = *err | CHECKINT_OVERFLOW_ERROR;
199  return x - y;
200}
201
202__CHECKINT_INLINE int64_t
203__checkint_int64_sub_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
204  if(x > ((uint64_t)(LLONG_MAX + y)) || y == LLONG_MIN)
205        *err = *err | CHECKINT_OVERFLOW_ERROR;
206  return x - y;
207}
208
209__CHECKINT_INLINE int64_t
210__checkint_int64_sub_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
211   if(x > y && ((x - y) > LLONG_MAX))
212        *err = *err | CHECKINT_OVERFLOW_ERROR;
213   else if(x < y && ((y - x - 1) > LLONG_MAX))
214        *err = *err | CHECKINT_OVERFLOW_ERROR;
215   return x - y;
216}
217
218__CHECKINT_INLINE uint64_t
219__checkint_uint64_sub_signed_signed(int64_t x, int64_t y, int32_t* err) {
220  if(((x < 0 && y <= 0) || (x >= 0 && y > 0)) && (x - y) < 0)
221        *err = *err | CHECKINT_OVERFLOW_ERROR;
222  else if(x < 0 && y > 0)
223        *err = *err | CHECKINT_OVERFLOW_ERROR;
224  return x - y;
225}
226
227__CHECKINT_INLINE uint64_t
228__checkint_uint64_sub_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
229   if(y > ((uint64_t) LLONG_MAX + 1) || ((int64_t) y) > x)
230        *err = *err | CHECKINT_OVERFLOW_ERROR;
231   return x - y;
232}
233
234__CHECKINT_INLINE uint64_t
235__checkint_uint64_sub_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
236  if(x <= LLONG_MAX)
237        return __checkint_uint64_sub_signed_signed(x, y, err);
238  else if (y == LLONG_MIN || -y > ULLONG_MAX - x)
239        *err = *err | CHECKINT_OVERFLOW_ERROR;
240  return x - y;
241}
242
243__CHECKINT_INLINE uint64_t
244__checkint_uint64_sub_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
245   if(x < y)
246        *err = *err | CHECKINT_OVERFLOW_ERROR;
247   return x - y;
248}
249
250__CHECKINT_INLINE int32_t
251__checkint_int32_mul(int64_t x, int64_t y, int32_t* err) {
252	int64_t z = x * y;
253	if (x < INT32_MIN || x > INT32_MAX || y < INT32_MIN || y > INT32_MAX) {
254		*err |= CHECKINT_OVERFLOW_ERROR;
255	}
256	if (z > INT_MAX || z < INT_MIN) *err |= CHECKINT_OVERFLOW_ERROR;
257	return (int32_t)z;
258}
259
260__CHECKINT_INLINE uint32_t
261__checkint_uint32_mul(int64_t x, int64_t y, int32_t* err) {
262	int64_t z = x * y;
263	if ((x & 0xffffffff00000000ull) || (y & 0xffffffff00000000ull)) *err |= CHECKINT_OVERFLOW_ERROR;
264	if (z > UINT_MAX || z < 0) *err |= CHECKINT_OVERFLOW_ERROR;
265	return (uint32_t)z;
266}
267
268__CHECKINT_INLINE int64_t
269__checkint_int64_mul_signed_signed(int64_t x, int64_t y, int32_t* err) {
270  if(x == 0 || y == 0) return 0;
271
272  if(!__checkint_is_mixed_sign64(x, y))
273  {
274    if(x > 0)
275    {
276       if(LLONG_MAX/x < y)
277            *err = *err | CHECKINT_OVERFLOW_ERROR;
278    }
279    else
280    {
281       if(x == LLONG_MIN || y == LLONG_MIN)
282            *err = *err | CHECKINT_OVERFLOW_ERROR;
283       if(LLONG_MAX/(-x) < (-y))
284            *err = *err | CHECKINT_OVERFLOW_ERROR;
285    }
286  }
287  else
288  {
289    if(x < 0)
290    {
291       if(x < LLONG_MIN/y)
292            *err = *err | CHECKINT_OVERFLOW_ERROR;
293    }
294    else
295       if(y < LLONG_MIN/x)
296            *err = *err | CHECKINT_OVERFLOW_ERROR;
297  }
298  return x * y;
299}
300
301__CHECKINT_INLINE uint64_t
302__checkint_uint64_mul_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
303  if(x == 0) return 0;
304
305  if(ULLONG_MAX/x < y)
306     *err = *err | CHECKINT_OVERFLOW_ERROR;
307  return x * y;
308}
309
310
311__CHECKINT_INLINE int64_t
312__checkint_int64_mul_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
313  if(x == 0) return 0;
314
315  if(LLONG_MAX/x < y)
316     *err = *err | CHECKINT_OVERFLOW_ERROR;
317  return x * y;
318}
319
320__CHECKINT_INLINE int64_t
321__checkint_int64_mul_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
322  if(y == 0) return 0;
323
324  if(x >= 0)
325       return __checkint_int64_mul_unsigned_unsigned(x, y, err);
326  else
327       if(x < LLONG_MIN/y || x > LLONG_MAX/y)
328            *err = *err | CHECKINT_OVERFLOW_ERROR;
329  return x * y;
330}
331
332__CHECKINT_INLINE int64_t
333__checkint_int64_mul_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
334   return __checkint_int64_mul_signed_unsigned(y, x, err);
335}
336
337__CHECKINT_INLINE uint64_t
338__checkint_uint64_mul_signed_signed(int64_t x, int64_t y, int32_t* err) {
339  if((x < 0 && y > 0) || (x > 0 && y < 0))
340     *err = *err | CHECKINT_OVERFLOW_ERROR;
341  else if(x > 0 && y > 0)
342     return __checkint_uint64_mul_unsigned_unsigned(x, y, err);
343  else
344     return __checkint_uint64_mul_unsigned_unsigned(-x, -y, err);
345  return x * y;
346}
347
348__CHECKINT_INLINE uint64_t
349__checkint_uint64_mul_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
350  if(x >= 0)
351      return __checkint_uint64_mul_unsigned_unsigned(x, y, err);
352  *err = *err | CHECKINT_OVERFLOW_ERROR;
353  return (uint64_t) (x * y);
354}
355
356__CHECKINT_INLINE uint64_t
357__checkint_uint64_mul_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
358   return __checkint_uint64_mul_signed_unsigned(y, x, err);
359}
360
361__CHECKINT_INLINE int32_t
362__checkint_int32_div_signed_signed(int32_t x, int32_t y, int32_t* err) {
363   if((x == INT_MIN) && y == -1)
364        *err = *err | CHECKINT_OVERFLOW_ERROR;
365   return x / y;
366}
367
368__CHECKINT_INLINE int32_t
369__checkint_int32_div_signed_unsigned(int32_t x, uint32_t y, int32_t* err) {
370  if(y <= INT_MAX)
371        return x / (int32_t) y;
372  return 0;
373}
374
375__CHECKINT_INLINE int32_t
376__checkint_int32_div_unsigned_signed(uint32_t x, int32_t y, int32_t* err) {
377  if(x == ((uint32_t) INT_MAX + 1) && y == -1)
378	return INT_MIN;
379  if(x > ((uint32_t) INT_MAX + 1) && y == -1)
380                *err = *err | CHECKINT_OVERFLOW_ERROR;
381  else if(x > INT_MAX && y == 1)
382                *err = *err | CHECKINT_OVERFLOW_ERROR;
383  if(x <= INT_MAX)
384    return ((int32_t) x) / y;
385  if(y > 0)
386    return x / y;
387  return -(x / (uint32_t) -y);
388}
389
390__CHECKINT_INLINE int32_t
391__checkint_int32_div_unsigned_unsigned(uint32_t x, uint32_t y, int32_t* err) {
392   uint32_t result = x / y;
393   if(result > INT_MAX)
394        *err = *err | CHECKINT_OVERFLOW_ERROR;
395   return x / y;
396}
397
398__CHECKINT_INLINE uint32_t
399__checkint_uint32_div_signed_signed(int32_t x, int32_t y, int32_t* err) {
400 int32_t result = x / y;
401   if(x == INT_MIN && y == -1)
402	return ((uint32_t) -x);
403   if(result < 0)
404        *err = *err | CHECKINT_OVERFLOW_ERROR;
405   if(x >= 0 && y > 0)
406     return x / y;
407   else if(x < 0 && y > 0)
408     return -((uint32_t) -x / y);
409   else if(x > 0 && y < 0)
410     return -(x / (uint32_t) -y);
411   else
412     return ((uint32_t) -x / (uint32_t) -y);
413}
414
415__CHECKINT_INLINE uint32_t
416__checkint_uint32_div_signed_unsigned(int32_t x, uint32_t y, int32_t* err) {
417   if(x < 0 && ((uint32_t) -x) >= y)
418        *err = *err | CHECKINT_OVERFLOW_ERROR;
419   if(x >= 0)
420   	return x / y;
421   return -(((uint32_t) -x) / y);
422}
423
424__CHECKINT_INLINE uint32_t
425__checkint_uint32_div_unsigned_signed(uint32_t x, int32_t y, int32_t* err) {
426   if(y < 0 && ((uint32_t) -y) <= x)
427        *err = *err | CHECKINT_OVERFLOW_ERROR;
428   if(y > 0)
429     return x / y;
430   return -(x / ((uint32_t) -y));
431}
432
433__CHECKINT_INLINE uint32_t
434__checkint_uint32_div_unsigned_unsigned(uint32_t x, uint32_t y, int32_t* err) {
435   return x / y;
436}
437
438__CHECKINT_INLINE int64_t
439__checkint_int64_div_signed_signed(int64_t x, int64_t y, int32_t* err) {
440   if((x == LLONG_MIN) && y == -1)
441        *err = *err | CHECKINT_OVERFLOW_ERROR;
442   return x / y;
443}
444
445__CHECKINT_INLINE int64_t
446__checkint_int64_div_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
447  if(y <= LLONG_MAX)
448        return x / (int64_t) y;
449  return 0;
450}
451
452__CHECKINT_INLINE int64_t
453__checkint_int64_div_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
454  if(x == ((uint64_t) LLONG_MAX + 1) && y == -1)
455        return LLONG_MIN;
456  if(x > ((uint64_t) LLONG_MAX + 1) && y == -1)
457                *err = *err | CHECKINT_OVERFLOW_ERROR;
458  else if(x > LLONG_MAX && y == 1)
459                *err = *err | CHECKINT_OVERFLOW_ERROR;
460  if(x <= LLONG_MAX)
461    return ((int64_t) x) / y;
462  if(y > 0)
463    return x / y;
464  return -(x / (uint64_t) -y);
465}
466
467__CHECKINT_INLINE int64_t
468__checkint_int64_div_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
469   uint64_t result = x / y;
470   if(result > LLONG_MAX)
471        *err = *err | CHECKINT_OVERFLOW_ERROR;
472   return x / y;
473}
474
475__CHECKINT_INLINE uint64_t
476__checkint_uint64_div_signed_signed(int64_t x, int64_t y, int32_t* err) {
477 int64_t result = x / y;
478   if(x == LLONG_MIN && y == -1)
479	return ((uint64_t)LLONG_MAX) + 1;
480   if(result < 0)
481        *err = *err | CHECKINT_OVERFLOW_ERROR;
482   if(x >= 0 && y > 0)
483     return x / y;
484   else if(x < 0 && y > 0)
485     return -((uint64_t) -x / y);
486   else if(x > 0 && y < 0)
487     return -(x / (uint64_t) -y);
488   else
489     return ((uint64_t) -x / (uint64_t) -y);
490}
491
492__CHECKINT_INLINE uint64_t
493__checkint_uint64_div_signed_unsigned(int64_t x, uint64_t y, int32_t* err) {
494   if(x < 0 && ((uint64_t) -x) >= y)
495        *err = *err | CHECKINT_OVERFLOW_ERROR;
496   if(x >= 0)
497        return x / y;
498   return -(((uint64_t) -x) / y);
499}
500
501__CHECKINT_INLINE uint64_t
502__checkint_uint64_div_unsigned_signed(uint64_t x, int64_t y, int32_t* err) {
503   if(y < 0 && ((uint64_t) -y) <= x)
504        *err = *err | CHECKINT_OVERFLOW_ERROR;
505   if(y > 0)
506     return x / y;
507   return -(x / ((uint64_t) -y));
508}
509
510__CHECKINT_INLINE uint64_t
511__checkint_uint64_div_unsigned_unsigned(uint64_t x, uint64_t y, int32_t* err) {
512   return x / y;
513}
514
515#undef __CHECKINT_INLINE
516
517/******/
518
519#ifdef __GNUC__
520#define	__checkint_same_type(e1, e2)	__builtin_types_compatible_p(__typeof__(e1), __typeof__(e2))
521#define	__checkint_cond_expr(c, e1, e2)	__builtin_choose_expr(c, e1, e2)
522#else
523#error "need compiler support for __checkint_same_type() and __checkint_cond_expr()"
524#endif
525
526/******/
527
528#define __checkint_is_signed(x)		(__checkint_same_type(x, int8_t) || __checkint_same_type(x, int16_t) || __checkint_same_type(x, int32_t) || __checkint_same_type(x, int64_t) || __checkint_same_type(x, signed long))
529#define __checkint_is_unsigned(x)	(__checkint_same_type(x, uint8_t) || __checkint_same_type(x, uint16_t) || __checkint_same_type(x, uint32_t) || __checkint_same_type(x, uint64_t) || __checkint_same_type(x, uintptr_t) || __checkint_same_type(x, unsigned long))
530
531#define __checkint_is_signed_signed(x, y) (__checkint_is_signed(x) && __checkint_is_signed(y))
532#define __checkint_is_signed_unsigned(x, y) (__checkint_is_signed(x) && __checkint_is_unsigned(y))
533#define __checkint_is_unsigned_signed(x, y) (__checkint_is_unsigned(x) && __checkint_is_signed(y))
534#define __checkint_is_unsigned_unsigned(x, y) (__checkint_is_unsigned(x) && __checkint_is_unsigned(y))
535
536/******/
537
538#define __CHECKINT_SIGN_DEMUX(type,oper,x,y,err) \
539	(__checkint_cond_expr(__checkint_is_signed_signed(x, y), __checkint_ ## type ## _ ## oper ## _signed_signed(x, y, err), \
540	 __checkint_cond_expr(__checkint_is_signed_unsigned(x, y), __checkint_ ## type ## _ ## oper ## _signed_unsigned(x, y, err), \
541	 __checkint_cond_expr(__checkint_is_unsigned_signed(x, y), __checkint_ ## type ## _ ## oper ## _unsigned_signed(x, y, err), \
542	 __checkint_cond_expr(__checkint_is_unsigned_unsigned(x, y), __checkint_ ## type ## _ ## oper ## _unsigned_unsigned(x, y, err), \
543		__checkint_ ## type ## _type_error(err))))))
544
545#define __checkint_int64_add(x,y,err) __CHECKINT_SIGN_DEMUX(int64,add,x,y,err)
546#define __checkint_uint64_add(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,add,x,y,err)
547
548#define __checkint_int64_sub(x,y,err) __CHECKINT_SIGN_DEMUX(int64,sub,x,y,err)
549#define __checkint_uint64_sub(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,sub,x,y,err)
550
551#define __checkint_int64_mul(x,y,err) __CHECKINT_SIGN_DEMUX(int64,mul,x,y,err)
552#define __checkint_uint64_mul(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,mul,x,y,err)
553
554#define __checkint_int32_div(x,y,err) __CHECKINT_SIGN_DEMUX(int32,div,x,y,err)
555#define __checkint_int64_div(x,y,err) __CHECKINT_SIGN_DEMUX(int64,div,x,y,err)
556#define __checkint_uint32_div(x,y,err) __CHECKINT_SIGN_DEMUX(uint32,div,x,y,err)
557#define __checkint_uint64_div(x,y,err) __CHECKINT_SIGN_DEMUX(uint64,div,x,y,err)
558
559__END_DECLS
560
561#endif /* __CHECKINT_H__ */
562