I'd forgotten that left shifting a negative value is UB until C++20.
Insert some casts to do unsigned shifts.
PT c++/98625
gcc/cp/
* module.cc (bytes_in::i, bytes_in::wi): Avoid left shift of
signed type.
v &= 0xf;
if (v & 0x8)
v |= -1 ^ 0x7;
+ /* unsigned necessary due to left shifts of -ve values. */
+ unsigned uv = unsigned (v);
if ((ptr = read (++bytes)))
while (bytes--)
- v = (v << 8) | (*ptr++ & 0xff);
+ uv = (uv << 8) | (*ptr++ & 0xff);
+ v = int (uv);
}
else if (v & 0x40)
v |= -1 ^ 0x3f;
v &= 0xf;
if (v & 0x8)
v |= -1 ^ 0x7;
+ /* unsigned necessary due to left shifts of -ve values. */
+ unsigned HOST_WIDE_INT uv = (unsigned HOST_WIDE_INT) v;
if ((ptr = read (++bytes)))
while (bytes--)
- v = (v << 8) | (*ptr++ & 0xff);
+ uv = (uv << 8) | (*ptr++ & 0xff);
+ v = (HOST_WIDE_INT) uv;
}
else if (v & 0x40)
v |= -1 ^ 0x3f;