On Wednesday, 16 March 2016 at 16:40:49 UTC, Shachar Shemesh
wrote:
Please consider the following program, which is a reduced
version of a problem I've spent the entire of today trying to
debug:
import std.stdio;
void main() {
enum ulong MAX_VAL = 256;
long value = -500;
if( value>MAX_VAL )
value = MAX_VAL;
writeln(value);
}
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.
The comparable program in C++, when compiled with gcc,
correctly warns about signed/unsigned comparison (though, to be
fair, it seems that clang doesn't).
I find integer promotion/comparison rules to be one of the
messier part of D at the moment. E.g. the compiler won't say
anything about `ulong foo = -1;` either.
Sadly, to solve that without imposing much pain on the users, you
need a more decent VRP than we currently have, for example the
following should compile:
```
void main ()
{
ushort f;
uint i;
if (i < ushort.max)
f = i;
}
```