intprops: work around IRIX 6.5 cc bug with 0u - 0u + -1
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 20 May 2011 02:16:04 +0000 (19:16 -0700)
committerIan Beckwith <ianb@erislabs.net>
Thu, 9 Jun 2011 17:34:36 +0000 (18:34 +0100)
See http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html
* lib/intprops.h (_GL_INT_NEGATE_CONVERT): New macro.
(_GL_INT_SIGNED, _GL_INT_MAXIMUM, _GL_DIVIDE_OVERFLOW):
(_GL_REMAINDER_OVERFLOW): Use it.
(cherry picked from commit 92c71a1c8324e3f0776fd0edb3fc400b4d04a592)

ChangeLog
lib/intprops.h

index 9e2d57c..86a480c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2011-05-19  Paul Eggert  <eggert@cs.ucla.edu>
 
+       intprops: work around IRIX 6.5 cc bug with 0u - 0u + -1
+       See http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html
+       * lib/intprops.h (_GL_INT_NEGATE_CONVERT): New macro.
+       (_GL_INT_SIGNED, _GL_INT_MAXIMUM, _GL_DIVIDE_OVERFLOW):
+       (_GL_REMAINDER_OVERFLOW): Use it.
+
        intprops: work around C compiler bugs
        * lib/intprops.h (INT_MULTIPLY_RANGE_OVERFLOW): Work around compiler
        bug in Sun C 5.11 2010/08/13 and other compilers; see
index 9107a4b..bd9f040 100644 (file)
    E should not have side effects.  */
 #define _GL_INT_CONVERT(e, v) ((e) - (e) + (v))
 
+/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
+   <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>.  */
+#define _GL_INT_NEGATE_CONVERT(e, v) ((e) - (e) - (v))
+
 /* The extra casts in the following macros work around compiler bugs,
    e.g., in Cray C 5.0.3.0.  */
 
@@ -50,7 +54,7 @@
 
 /* Return 1 if the integer expression E, after integer promotion, has
    a signed type.  E should not have side effects.  */
-#define _GL_INT_SIGNED(e) (_GL_INT_CONVERT (e, -1) < 0)
+#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
 
 
 /* Minimum and maximum values for integer types and expressions.  These
@@ -79,7 +83,7 @@
 #define _GL_INT_MAXIMUM(e)                                              \
   (_GL_INT_SIGNED (e)                                                   \
    ? _GL_SIGNED_INT_MAXIMUM (e)                                         \
-   : _GL_INT_CONVERT (e, -1))
+   : _GL_INT_NEGATE_CONVERT (e, 1))
 #define _GL_SIGNED_INT_MAXIMUM(e)                                       \
   (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1)
 
   (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a))))       \
    || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
 #define _GL_DIVIDE_OVERFLOW(a, b, min, max)                             \
-  ((min) < 0 ? (b) == _GL_INT_CONVERT (min, -1) && (a) < - (max)        \
+  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
    : (a) < 0 ? (b) <= (a) + (b) - 1                                     \
    : (b) < 0 && (a) + (b) <= (a))
 #define _GL_REMAINDER_OVERFLOW(a, b, min, max)                          \
-  ((min) < 0 ? (b) == _GL_INT_CONVERT (min, -1) && (a) < - (max)        \
+  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
    : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b)                     \
    : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))