Summary:
The code to convert signed 128-bit integer values to strings would trigger
undefined behaviour when trying to convert the most negative possible value,
as exposed by the new test cases.
The fix is to negate the corresponding unsigned value (just like it's already
done for the 64-bit code).
This change doesn't have any performance impact.
Reviewed By: yfeldblum
Differential Revision:
D3455817
fbshipit-source-id:
83782992324f443789760a0e61cd9b889faaf317
size_t p;
if (value < 0) {
- p = detail::unsafeTelescope128(buffer, sizeof(buffer), Usrc(-value));
+ p = detail::unsafeTelescope128(buffer, sizeof(buffer), -Usrc(value));
buffer[--p] = '-';
} else {
p = detail::unsafeTelescope128(buffer, sizeof(buffer), value);
svalue = 0;
EXPECT_EQ(to<String>(svalue), "0");
+ value = ~__int128(0);
+ EXPECT_EQ(to<String>(value), "340282366920938463463374607431768211455");
+
+ svalue = -(Uint(1) << 127);
+ EXPECT_EQ(to<String>(svalue), "-170141183460469231731687303715884105728");
+
+ svalue = (Uint(1) << 127) - 1;
+ EXPECT_EQ(to<String>(svalue), "170141183460469231731687303715884105727");
+
// TODO: the following do not compile to<__int128> ...
#if 0