summaryrefslogtreecommitdiff
path: root/src/data.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2014-04-27 18:29:44 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2014-04-27 18:29:44 -0700
commit6ab1b16c54b63d1c4217b6fcea026400029fcc72 (patch)
treee3fef3d5e3f4436b2bc59b1006afc98075da06f0 /src/data.c
parent196bfaecb0caffcdbb699694139a97148e90e227 (diff)
downloademacs-6ab1b16c54b63d1c4217b6fcea026400029fcc72.tar.gz
Avoid undefined behavior in signed left shift.
This ports to GCC 4.9.0 with -fsanitize=undefined. * alloc.c (bool_vector_fill, SETMARKBIT, UNSETMARKBIT): * data.c (Fash): * regex.c (extract_number): * lisp.h (make_number, XINT): Do not shift a 1 bit left into a sign bit. * alloc.c (struct cons_block, struct float_block): Use unsigned, not int, for gcmarkbits. All uses changed.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/data.c b/src/data.c
index 965ddd215f5..bf863aaed79 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2895,7 +2895,7 @@ In this case, the sign bit is duplicated. */)
if (XINT (count) >= BITS_PER_EMACS_INT)
XSETINT (val, 0);
else if (XINT (count) > 0)
- XSETINT (val, XINT (value) << XFASTINT (count));
+ XSETINT (val, XUINT (value) << XFASTINT (count));
else if (XINT (count) <= -BITS_PER_EMACS_INT)
XSETINT (val, XINT (value) < 0 ? -1 : 0);
else