Hi, I am the guy who implemented the (currently incomplete) vrp for sdc.

I see vrp as a tool to avoid _unnecessary_ casts. _Not_ as means to avoid _all_ casts.

void main(in string[] args) {
    immutable size_t len = args.length % 10;
    ubyte x = len;
    ubyte[] a;
    foreach (immutable i; 0u .. len)
        a ~= i;
}

The problem with vrp for non-static immutable values is, that vrp becomes a runtime-thing and I would like to avoid that! Tracking the range of a Variable at runtime could cause significant overhead!

Doing static analysis and tracking Variable-Ranges and assignments at compile-time, is possible but difficult and there are a number of reasons why not to do it.

1. Slows compilation down
2. implementation is not straight-forward and bugs could be hard to find. 3. Code that relays on this may not be easy to read, and it may be hard for the programmer to see why a particular assignment does not need a cast!

For simple code like the one posted above it is easy to see why it works.
anything mod 10 can only be in the range of [-9 .. 9]

But if we have much logic and control-flow between the assignment and the definition of the assigning variable then not haveing an explicit cast could cause a bit of puzzlement.

Reply via email to