On Monday, 9 May 2016 at 09:10:19 UTC, Walter Bright wrote:
Don Clugston pointed out in his DConf 2016 talk that:
float f = 1.30;
assert(f == 1.30);
will always be false since 1.30 is not representable as a
float. However,
float f = 1.30;
assert(f == cast(float)1.30);
will be true.
So, should the compiler emit a warning for the former case?
(1) Yes, emit a warning for this case.
(2) Generalize it to all variables, like Nordlöw suggested.
(3) Generalize it to all comparisons as well, including < and > .
(4) While we're at it, let's also emit a warning when comparing
signed and unsigned types.
(5) Dare I say it... warn against implicit conversions of double
to float.
(6) The same applies to "real" as well.
All of these scenarios are capable of producing "incorrect"
results, are a source of discrete bugs (often corner cases that
we failed to consider and test), and can be hard to detect. It's
about time we stopped being stubborn and flagged these things as
warnings. Even if they require a special compiler flag and are
disabled by default, that's better than nothing.