Why is this not a warning?

jmh530 via Digitalmars-d digitalmars-d at puremagic.com
Wed Mar 16 10:39:56 PDT 2016


On Wednesday, 16 March 2016 at 16:40:49 UTC, Shachar Shemesh 
wrote:
>
> People who are marginally familiar with integer promotion will 
> not be surprised to know that the program prints "256". What is 
> surprising to me is that this produced neither error nor 
> warning.
>

Here's a simpler example:

import std.stdio : writeln;

void main() {
     ulong MAX_VAL = 256;
     long value = -500;

     writeln(value > MAX_VAL); //prints true
}

Looks like integer promotion in D follows the same rules as C: 
when the types are the same size, the signed type is converted to 
the unsigned type. Definitely could cause an issue and deserves a 
warning, as you say.

It's not like you could switch the rule to being that an unsigned 
type is converted to the signed type. You would still get errors, 
just over a different range. You could instead write something 
like:

bool compare(long a, ulong b)
{
	if (b < long.sizeof)
		return a > cast(long)b;
	else
		return cast(float)a > cast(float)b;
}


More information about the Digitalmars-d mailing list