On Monday, 13 May 2013 at 00:00:54 UTC, Manu wrote:
So, here's an issue that constantly drives me nuts, and an
elegant solution
seems so do-able.
void func(int x)
{
x &= 0xFFFF;
short s = x; // Error! (but we know x is 0 .. 65535)
if(x < 256)
{
byte b = x; // Error! (we also know x is 0 .. 255)
}
}
It would be really nice if the compiler would carry around the
known
possible range of values, and refer to that information when
performing
down-casting assignments.
It would also be very useful information for the back end, it
can choose
more efficient types if it knows the range, or produce jump
tables rather
than branch sequences.
I think the compiler would need a min, max, and mask for any
integers, and
update them as it works.
There are many sources of this information.
Comparisons effectively limit the range:
if(x > 0)
{
// x = 0 .. int.max
}
else
{
// x = int.min .. -1
}
Masks, obviously:
x &= 15;
Also contracts are a really great source of seeding this
information on
function entry.
Has this been discussed? It seems simple, and it's invisible to
the
language. It would just reduce some boilerplate (tedious
casts), and also
offer some great optimisation opportunities.
I've been thinking about this for a while from an optimisation
point of view. Is this not a common practice for an optimising
compiler?