From 6df4097e922af99c7f051978be2df0ffbc51c929 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 16 Jan 2011 23:16:08 -0800 Subject: [PATCH] * 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. --- src/ChangeLog | 8 ++++++++ src/lisp.h | 13 +++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 40b6e0e6195..cb51917bb31 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,13 @@ 2011-01-17 Paul Eggert + * 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). diff --git a/src/lisp.h b/src/lisp.h index eadbbacbff4..e177f483452 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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 */ - -- 2.39.2