]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp.h: Redo flags and XSET slightly to avoid overflow diagnostics.
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 17 Jan 2011 07:16:08 +0000 (23:16 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 17 Jan 2011 07:16:08 +0000 (23:16 -0800)
These changes make compilation easier to follow with Sun cc.
(ARRAY_MARK_FLAG): Make it signed, so that it can be assigned to
EMACS_INT values without provoking overflow diagnostics.
(PSEUDOVECTOR_FLAG): Likewise, for consistency.
(XSET) [! USE_LSB_TAG]: Use unsigned left shift to avoid overflow
diagnostic with signed left shift.

src/ChangeLog
src/lisp.h

index 40b6e0e6195340bf8289fcc5380287b89519c2e8..cb51917bb310992302f0a49dd1f7fe16334b0b57 100644 (file)
@@ -1,5 +1,13 @@
 2011-01-17  Paul Eggert  <eggert@cs.ucla.edu>
 
+       * lisp.h: Redo flags and XSET slightly to avoid overflow diagnostics.
+       These changes make compilation easier to follow with Sun cc.
+       (ARRAY_MARK_FLAG): Make it signed, so that it can be assigned to
+       EMACS_INT values without provoking overflow diagnostics.
+       (PSEUDOVECTOR_FLAG): Likewise, for consistency.
+       (XSET) [! USE_LSB_TAG]: Use unsigned left shift to avoid overflow
+       diagnostic with signed left shift.
+
        * fileio.c (make_temp_name): Remove unreachable code.
 
        * fontset.c (free_realized_fontset): Mark unreachable code with if (0).
index eadbbacbff4e83b918603792f3fa8fd5e4e82a44..e177f483452328679af66529af96ad28b694ba0e 100644 (file)
@@ -327,13 +327,14 @@ typedef EMACS_INT Lisp_Object;
 #define LISP_MAKE_RVALUE(o) (0+(o))
 #endif /* USE_LISP_UNION_TYPE */
 
-/* In the size word of a vector, this bit means the vector has been marked.  */
+/* In the size word of a vector, this bit means the vector has been marked.
+   (Shift -1 left, not 1, to avoid provoking overflow diagnostics.)  */
 
-#define ARRAY_MARK_FLAG ((EMACS_UINT) 1 << (BITS_PER_EMACS_INT - 1))
+#define ARRAY_MARK_FLAG ((EMACS_INT) -1 << (BITS_PER_EMACS_INT - 1))
 
 /* In the size word of a struct Lisp_Vector, this bit means it's really
    some other vector-like object.  */
-#define PSEUDOVECTOR_FLAG ((ARRAY_MARK_FLAG >> 1))
+#define PSEUDOVECTOR_FLAG ((EMACS_INT) 1 << (BITS_PER_EMACS_INT - 2))
 
 /* In a pseudovector, the size field actually contains a word with one
    PSEUDOVECTOR_FLAG bit set, and exactly one of the following bits to
@@ -437,8 +438,9 @@ enum pvec_type
   ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
 #endif
 
-#define XSET(var, type, ptr) \
-   ((var) = ((EMACS_INT)(type) << VALBITS) + ((EMACS_INT) (ptr) & VALMASK))
+#define XSET(var, type, ptr)                             \
+   ((var) = ((EMACS_INT) ((EMACS_UINT) (type) << VALBITS) \
+            + ((EMACS_INT) (ptr) & VALMASK)))
 
 #define XPNTR(a) ((EMACS_UINT) ((a) & VALMASK))
 
@@ -3670,4 +3672,3 @@ extern Lisp_Object safe_alloca_unwind (Lisp_Object);
 
 
 #endif /* EMACS_LISP_H */
-