Hi,

I got this thing working and I think it's about time I get some comments on it.

I've been wanting to extend Value Rang Propagation (VRE) for some time now. Mostly because of the fix to the troublesome "signed-unsigned comparisons" issue. Enabling VRE for if-else and "&&" will fix many of the false-positive warnings given out by the fix to bug 259 by allowing code like this: if (signed > 0 && signed < unsigned) { .. }

Have a look at the branch:
https://github.com/lionello/dmd/compare/if-else-range

There, I've also added a __traits(intrange, <expression>) which returns a tuple with the min and max for the given expression. It's used in the test case as follows:


    const i = foo ? -1 : 33;

    if (i)
      static assert(__traits(intrange, i) == Tuple!(-1, 33));
    else
    {
      //static assert(i == 0); TODO
      static assert(__traits(intrange, i) == Tuple!(0, 0));
    }

    if (i == 33)
    {
      //static assert(i == 33); TODO
      static assert(__traits(intrange, i) == Tuple!(33, 33));
    }
    else
      static assert(__traits(intrange, i) == Tuple!(-1, 32));

    if (10 <= i)
      static assert(__traits(intrange, i) == Tuple!(10, 33));
    else
      static assert(__traits(intrange, i) == Tuple!(-1, 9));


It would be nice if this can be used by CTFE as well.

Destroy?

L.

Reply via email to