Fix (ash -1 1) undefined behavior

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).
This commit is contained in:
Paul Eggert 2026-05-17 19:47:52 -07:00
parent 8c71b0d6b8
commit 56ae704e5b

View file

@ -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);