RFC: Value range propagation for if-else

Tove via Digitalmars-d digitalmars-d at puremagic.com
Mon Jun 30 20:59:24 PDT 2014


On Monday, 30 June 2014 at 07:47:22 UTC, Lionello Lunesu wrote:
> Latest [1] now also supports CTFE:
>
>     const i = foo ? -1 : 33;
>
>     if (i)
>       static assert(__traits(intrange, i) == Tuple!(-1, 33));
>     else
>     {
>       static assert(i == 0); // Works now!
>       static assert(__traits(intrange, i) == Tuple!(0, 0));
>     }
>
>     if (i == 33)
>     {
>       static assert(i == 33); // Works now!
>       static assert(__traits(intrange, i) == Tuple!(33, 33));
>     }
>     else
>       static assert(__traits(intrange, i) == Tuple!(-1, 32));
>
>
> Next up: support for immutable/const members and "if (i) static 
> assert(i)"
>
> L.
>
> [1] https://github.com/lionello/dmd/tree/if-else-range

Fantastic work, although I would prefer Bearophile's  
'value_range', is there any reason why the same trait could not 
be used for float, etc? (I don't need it for float, just as an 
example).

I guess an interval_set would be too complicated, slowing down 
the compiler? i.e. multiple ranges, or multiple values, just 
thinking out loud... Anyway what you did already is kick ass! :)


More information about the Digitalmars-d mailing list