return -ABS(fallback);
}
+/* abs(3) says: Trying to take the absolute value of the most negative integer is not defined. */
#define _DEFINE_ABS_WRAPPER(name) \
static inline bool ERRNO_IS_##name(intmax_t r) { \
if (r == INTMAX_MIN) \
UNIQ_T(A, aq) > UNIQ_T(B, bq) ? UNIQ_T(A, aq) : UNIQ_T(B, bq); \
})
-#define ABS(a) __ABS(UNIQ, (a))
-#define __ABS(aq, a) \
-({ \
- const typeof(a) UNIQ_T(A, aq) = (a); \
- UNIQ_T(A, aq) < 0 ? -UNIQ_T(A, aq) : UNIQ_T(A, aq); \
-})
+#ifdef __clang__
+# define ABS(a) __builtin_llabs(a)
+#else
+# define ABS(a) __builtin_imaxabs(a)
+#endif
+assert_cc(sizeof(intmax_t) <= sizeof(long long));
#define IS_UNSIGNED_INTEGER_TYPE(type) \
(__builtin_types_compatible_p(typeof(type), unsigned char) || \