<div dir="ltr">So, here's an issue that constantly drives me nuts, and an elegant solution seems so do-able.<div><br></div><div style>void func(int x)</div><div style>{</div><div style>  x &= 0xFFFF;</div><div style>
  short s = x; // Error! (but we know x is 0 .. 65535)</div><div style><br></div><div style>  if(x < 256)</div><div style>  {</div><div style>    byte b = x; // Error! (we also know x is 0 .. 255)</div><div style>  }</div>
<div style>}</div><div style><br></div><div style>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.<br></div>
<div style>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.</div><div style><br></div><div style>I think the compiler would need a min, max, and mask for any integers, and update them as it works.</div>
<div style><br></div><div style>There are many sources of this information.</div><div style>Comparisons effectively limit the range:<br></div><div style>if(x > 0)</div><div style>{</div><div style>  // x = 0 .. int.max</div>
<div style>}</div><div style>else</div><div style>{</div><div style>  // x = int.min .. -1</div><div style>}</div><div style><br></div><div style>Masks, obviously:</div><div style>x &= 15;</div><div style><br></div><div style>
Also contracts are a really great source of seeding this information on function entry.</div><div style><br></div><div style>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.</div>
</div>