On 01/17/2018 09:30 PM, rumbu wrote:
And here is why is bothering me:
auto max = isNegative ? cast(Unsigned!T)(-T.min) : cast(Unsigned!T)T.max);
The generic code above (which worked for all signed integral types T in
2.077) must be rewritten like this in 2.078:
static if (T.sizeof >= 4)
auto max = isNegative ? cast(Unsigned!T)(-T.min) :
cast(Unsigned!T)T.max;
else
auto max = isNegative ? cast(Unsigned!T)(-cast(int)T.min) :
cast(Unsigned!T)T.max;
Now I have to translate an 1-liner in a 4-liner all around my project.
So here you prefer the old behavior.
But in your previous post you wrote:
compiled with 2.077 or 2.078 with -transition=intpromote
byte b = byte.min;
ulong u = -b;
writeln(u);
outputs correctly 128
And that's the new behavior.
You can't have both. You either get to keep the shorter version of your
max code, or you get "correct" results on `ulong u = -b;`.
Except you can actually (almost) keep your max code, as far as I see.
Under the old rules `-T.min` is just `T.min` again. So you can just drop
the negation there and get the same result. And then it works under the
new rules too, because there's no negation involved.
I.e.: auto max = isNegative ? cast(Unsigned!T)(T.min) :
cast(Unsigned!T)T.max;