Wrong enum comparisons
Denis Shelomovskij
verylonglogin.reg at gmail.com
Mon May 28 01:58:19 PDT 2012
27.05.2012 23:45, bearophile написал:
> In some code I have created a small bug that can be reduced to something
> like this, that the D compiler has not caught at compile-time:
>
>
> enum E1 { A, B }
> enum E2 { C, D }
> void main() {
> E1[2] a;
> with (E2)
> assert(a[0] == D);
> }
>
>
> Why isn't D able to statically tell when you compare values of different
> enums?
> How much work is implementing this compile-time test inside the D
> front-end?
>
> Thank you,
> bye,
> bearophile
Enumerations are in very poor state in D now. May be, it should be
deprecated just like typedef and be library-implemented. Why? Because we
do need really strict type/operation checking with enum so one have to
write explicitly casts to do non-standard things. The two main
enumeration types are:
* list - must hold only one value, only opAssign and opEqual are
allowed, by default nextValue = prevValue + 1 starting with 0
* flags - must hold superposition of values, like list, but binary
operations are also allowed, by default nextValue = prevValue << 1
starting with 1
These also allow finally implement right to!string for flags.
By the way, current enums can be modified to correspond "list"
enumeration and flags can be added as library component.
--
Денис В. Шеломовский
Denis V. Shelomovskij
More information about the Digitalmars-d
mailing list