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