aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
diff options
context:
space:
mode:
authorPaul Eggert2015-01-07 23:02:01 -0800
committerPaul Eggert2015-01-07 23:02:27 -0800
commitf6a27d26dccdcc121bebc96fbf41f656fbf13138 (patch)
tree344d746bc2738cbf6a19bc378236b3a6810febc2 /src/lisp.h
parent9f654763f2223ce9f3317b44a3d1a8ac2c8bb832 (diff)
downloademacs-f6a27d26dccdcc121bebc96fbf41f656fbf13138.tar.gz
emacs-f6a27d26dccdcc121bebc96fbf41f656fbf13138.zip
Port Qnil==0 XUNTAG to clang
clang has undefined behavior if the program subtracts an integer from (char *) 0. Problem reported by YAMAMOTO Mitsuharu in: http://lists.gnu.org/archive/html/emacs-devel/2015-01/msg00132.html * lisp.h (lisp_h_XUNTAG) [USE_LSB_TAG]: (XUNTAG) [!USE_LSB_TAG]: Port to clang 3.5.0.
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 1f18b5e0775..b9263f88c11 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -368,7 +368,7 @@ error !;
368# define lisp_h_XFASTINT(a) XINT (a) 368# define lisp_h_XFASTINT(a) XINT (a)
369# define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS) 369# define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)
370# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK)) 370# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
371# define lisp_h_XUNTAG(a, type) XUNTAGBASE (a, type, 0) 371# define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
372# define lisp_h_XUNTAGBASE(a, type, base) \ 372# define lisp_h_XUNTAGBASE(a, type, base) \
373 ((void *) ((char *) (base) - (type) + (intptr_t) XLI (a))) 373 ((void *) ((char *) (base) - (type) + (intptr_t) XLI (a)))
374#endif 374#endif
@@ -905,7 +905,8 @@ XUNTAGBASE (Lisp_Object a, int type, void *base)
905INLINE void * 905INLINE void *
906XUNTAG (Lisp_Object a, int type) 906XUNTAG (Lisp_Object a, int type)
907{ 907{
908 return XUNTAGBASE (a, type, 0); 908 intptr_t i = USE_LSB_TAG ? XLI (a) - type : XLI (a) & VALMASK;
909 return (void *) i;
909} 910}
910 911
911#endif /* ! USE_LSB_TAG */ 912#endif /* ! USE_LSB_TAG */