On Tuesday, 11 December 2012 at 16:09:14 UTC, Andrei Alexandrescu wrote:
On 12/11/12 8:24 AM, d coder wrote:

No, it's a fix of a gotcha from C. The C code would just allow the
   assignment.


Yes Andrei.

But it does not look clean if you have to write:

byte a, b, c;
a = cast(byte) (b + c);

Well I know the advantages (safety). But imagine having to write all that when working with bytes and shorts. Makes it really difficult to
work with shorts and bytes in D.

Value range propagation automatically avoids the need for a lot of those casts. http://www.drdobbs.com/tools/value-range-propagation/229300211

Would I be asking for too much if I ask
DMD to provide a compiler flag that makes it return bytes and shorts for
operations on them?

That won't happen.


Andrei

But than we have a bug in the value range propagation algorithm.
E.g in the original program:
void main()
{
 import std.stdio;
 ushort a = 0x55AA;
 ushort b = 0xAA55;
 writefln("%X", ~(a | b));
}

(a | b) will be in the range of ushort values and ~ of that also remains in the same value range. In other words, it makes no sense that boolean ops (and, or, xor, 1's compliment, 2's compliment) will require type promotion as they cannot exceed the original width of the values. This is unlike arithmetic which can require promotion.

Reply via email to