summaryrefslogtreecommitdiff
path: root/lib/intprops.h
diff options
context:
space:
mode:
authorJim Meyering <meyering@fb.com>2016-08-29 09:45:18 -0700
committerJim Meyering <meyering@fb.com>2016-08-29 09:45:18 -0700
commit175b4e22f99e00996b72f822f5ae54dca8243d19 (patch)
tree4bf03ab01b9a79e10b4df02109575ecf27d985c4 /lib/intprops.h
parentb9c364f02cb7a7485cd063fa2cbcbf82042fa8cc (diff)
downloadgnulib-175b4e22f99e00996b72f822f5ae54dca8243d19.tar.gz
intprops.h, xalloc-oversized.h: work with gcc 7
In gcc 6, __builtin_add_overflow, __builtin_sub_overflow and __builtin_mul_overflow each accept a NULL pointer as the third argument. However in gcc 7, that is no longer accepted. Instead, one must use the "_p"-suffixed names, with which, the third parameter is no longer a pointer. * lib/intprops.h (_GL_HAS_BUILTIN_OVERFLOW_WITH_NULL): Correct the definition: not true for gcc 7 and subsequent. (_GL_HAS_BUILTIN_OVERFLOW_P): Define. (_GL_ADD_OVERFLOW, _GL_SUBTRACT_OVERFLOW, _GL_MULTIPLY_OVERFLOW): Provide new definitions for gcc 7 and subsequent. * lib/xalloc-oversized.h (xalloc_oversized): Provide a definition that works with gcc-7.
Diffstat (limited to 'lib/intprops.h')
-rw-r--r--lib/intprops.h14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/intprops.h b/lib/intprops.h
index 0c45550a9b..d2a65cc5e4 100644
--- a/lib/intprops.h
+++ b/lib/intprops.h
@@ -229,13 +229,23 @@ verify (TYPE_MAXIMUM (long long int) == LLONG_MAX);
: (max) >> (b) < (a))
/* True if __builtin_add_overflow (A, B, P) works when P is null. */
-#define _GL_HAS_BUILTIN_OVERFLOW_WITH_NULL (7 <= __GNUC__)
+#define _GL_HAS_BUILTIN_OVERFLOW_WITH_NULL (6 == __GNUC__)
+
+/* True if __builtin_add_overflow_p (A, B, C) works. */
+#define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
/* The _GL*_OVERFLOW macros have the same restrictions as the
*_RANGE_OVERFLOW macros, except that they do not assume that operands
(e.g., A and B) have the same type as MIN and MAX. Instead, they assume
that the result (e.g., A + B) has that type. */
-#if _GL_HAS_BUILTIN_OVERFLOW_WITH_NULL
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define _GL_ADD_OVERFLOW(a, b, min, max) \
+ __builtin_add_overflow_p (a, b, (a) + (b))
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
+ __builtin_sub_overflow_p (a, b, (a) - (b))
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
+ __builtin_mul_overflow_p (a, b, (a) * (b))
+#elif _GL_HAS_BUILTIN_OVERFLOW_WITH_NULL
# define _GL_ADD_OVERFLOW(a, b, min, max) \
__builtin_add_overflow (a, b, (__typeof__ ((a) + (b)) *) 0)
# define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \