Lots of bool operations shouldn't compile
Don Clugston
dac at nospam.com.au
Tue Feb 28 07:52:27 PST 2006
Oskar Linde wrote:
> Don Clugston skrev:
>> Four examples, although it's only one bug. Almost all operations on
>> bool should be disabled, but I found the ones below a little amusing.
>> None of them should compile, but they all evaluate as "true".
>>
>> void main()
>> {
>> if (true >= ireal.nan) { writefln("This is kind of ridiculous"); }
>> if (false >= ireal.nan) { writefln("This is kind of ridiculous"); }
>> if (true <> -2i) { writefln("NCEG operators too ??!!"); }
>> if (false != -2i) { writefln("and again"); }
>> }
>
> According to the specification, booleans are a numeric type. true == 1
> and false == 0. So this error is not specific to bool.
>
> Try s/true/1/g and s/false/0/g and you will get the same results.
>
> The first two comparisons should be false I guess since they are
> unordered. The other two are correct.
OK, there's another bug in there, comparing an int with an imaginary
real should also not be legal.
if (1 > -2i) { assert(0); }
if (1 > ireal.nan) { assert(0); }
Reals and ireals cannot be compared. Ever.
> (If it is wise to have bool as a numeric type is a different question.)
I think it's very hard to justify numeric operations on bools.
(which is an _entirely_ different issue to implicit "!is null" in
conditionals, I wholeheartedly support if (p), while(1){} and assert(0) ).
But I note that
bool b = 7;
is currently disallowed, while
b+=5;
compiles.
There's no reason to write b++, it's just letting bugs in. Write b=true
instead. I hope that all such bug-breeding nonsense disappears. With a
one bit integer, it wasn't clear how such things should behave (every
other integral types wraps around, so b=5 should mean b=0 -- yuck!), but
hopefully it can be cleared up now.
More information about the Digitalmars-d-bugs
mailing list