summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2015-01-07 23:02:01 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2015-01-07 23:02:27 -0800
commitf6a27d26dccdcc121bebc96fbf41f656fbf13138 (patch)
tree344d746bc2738cbf6a19bc378236b3a6810febc2 /src
parent9f654763f2223ce9f3317b44a3d1a8ac2c8bb832 (diff)
downloademacs-f6a27d26dccdcc121bebc96fbf41f656fbf13138.tar.gz
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')
-rw-r--r--src/ChangeLog7
-rw-r--r--src/lisp.h5
2 files changed, 10 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index eae16c27b75..817483be1fb 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,12 @@
2015-01-08 Paul Eggert <eggert@cs.ucla.edu>
+ 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.
+
Port GFileMonitor * hack to Qnil==0 platforms
Reported by Glenn Morris in: http://bugs.gnu.org/15880#112
* gfilenotify.c (monitor_to_lisp, lisp_to_monitor): New functions.
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 !;
# define lisp_h_XFASTINT(a) XINT (a)
# define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)
# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
-# define lisp_h_XUNTAG(a, type) XUNTAGBASE (a, type, 0)
+# define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
# define lisp_h_XUNTAGBASE(a, type, base) \
((void *) ((char *) (base) - (type) + (intptr_t) XLI (a)))
#endif
@@ -905,7 +905,8 @@ XUNTAGBASE (Lisp_Object a, int type, void *base)
INLINE void *
XUNTAG (Lisp_Object a, int type)
{
- return XUNTAGBASE (a, type, 0);
+ intptr_t i = USE_LSB_TAG ? XLI (a) - type : XLI (a) & VALMASK;
+ return (void *) i;
}
#endif /* ! USE_LSB_TAG */