* ccl.c (ASCENDING_ORDER): New macro, to work around GCC bug 43772.
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 15 Jun 2011 19:40:52 +0000 (12:40 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 15 Jun 2011 19:40:52 +0000 (12:40 -0700)
(GET_CCL_RANGE, IN_INT_RANGE): Use it.

src/ChangeLog
src/ccl.c

index 5dafba7..d06cde5 100644 (file)
@@ -2,6 +2,9 @@
 
        Integer overflow and signedness fixes.
 
+       * ccl.c (ASCENDING_ORDER): New macro, to work around GCC bug 43772.
+       (GET_CCL_RANGE, IN_INT_RANGE): Use it.
+
        * fileio.c: Don't assume EMACS_INT fits in off_t.
        (emacs_lseek): New static function.
        (Finsert_file_contents, Fwrite_region): Use it.
index e2ef4f1..30d151f 100644 (file)
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -745,11 +745,15 @@ while(0)
 
 #endif
 
+/* Use "&" rather than "&&" to suppress a bogus GCC warning; see
+   <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772>.  */
+#define ASCENDING_ORDER(lo, med, hi) (((lo) <= (med)) & ((med) <= (hi)))
+
 #define GET_CCL_RANGE(var, ccl_prog, ic, lo, hi)               \
   do                                                           \
     {                                                          \
       EMACS_INT prog_word = XINT ((ccl_prog)[ic]);             \
-      if (! ((lo) <= prog_word && prog_word <= (hi)))          \
+      if (! ASCENDING_ORDER (lo, prog_word, hi))               \
        CCL_INVALID_CMD;                                        \
       (var) = prog_word;                                       \
     }                                                          \
@@ -761,7 +765,7 @@ while(0)
 #define GET_CCL_INT(var, ccl_prog, ic)                         \
   GET_CCL_RANGE (var, ccl_prog, ic, INT_MIN, INT_MAX)
 
-#define IN_INT_RANGE(val) (INT_MIN <= (val) && (val) <= INT_MAX)
+#define IN_INT_RANGE(val) ASCENDING_ORDER (INT_MIN, val, INT_MAX)
 
 /* Encode one character CH to multibyte form and write to the current
    output buffer.  If CH is less than 256, CH is written as is.  */