From 56ae704e5b2fad285dc00e28d7c5e78f05133a8b Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 17 May 2026 19:47:52 -0700 Subject: [PATCH] Fix (ash -1 1) undefined behavior MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem discovered with GCC 16.1.1 -fsanitize=undefined. * src/data.c (Fash): Don’t left-shift a negative number; behavior is undefined (ISO C23 § 6.5.8 ¶ 4). --- src/data.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data.c b/src/data.c index b269ec6d501..2f245ce8061 100644 --- a/src/data.c +++ b/src/data.c @@ -3599,10 +3599,10 @@ discarding bits. */) else if (FIXNUMP (value)) { EMACS_INT v = XFIXNUM (value); - EMACS_UINT uv = v < 0 ? ~v : v; - EMACS_INT lz = stdc_leading_zeros (uv); + EMACS_UINT uv = v, uvcomp = v < 0 ? ~uv : uv; + EMACS_INT lz = stdc_leading_zeros (uvcomp); if (EMACS_INT_WIDTH - FIXNUM_BITS < lz - c) - return make_fixnum (v << c); + return make_fixnum ((EMACS_INT) {uv << c}); } mpz_t const *zval = bignum_integer (&mpz[0], value);