-------------------- enum E : real { a, b } -------------------- assert expression.c(1392) 0 -------------------- This error does not occur when all members are explicitly initialized, or there is only one member in the enum.
PATCH: enum.c, in EnumDeclaration::semantic(), around line 195. The interpret optimisation should be done BEFORE the cast. Just swap the order. Otherwise, constfold functions such as Add() think it's an enum type, not a real, and so they default to integer, and chaos ensues. // Now set e to (elast + 1) e = new AddExp(em->loc, elast, new IntegerExp(em->loc, 1, Type::tint32)); e = e->semantic(sce); + e = e->optimize(WANTvalue | WANTinterpret); e = e->castTo(sce, elast->type); - e = e->optimize(WANTvalue | WANTinterpret); ---- However, there are other problems in this function. If you try to use a struct inside an enum, you get garbage error messages without line number; you find that you need to define a .max() property for the struct, and error messages are repeated. I attach a revised enum.c which fixes these problems, and allows the code below to work correctly: enum G : real { a, b } enum E : real { a=18.0, b } enum F : real { c=E.b, d } struct S{ int x; S opAdd(int q) { return S(x+1);} int opCmp(S s) { return x < s.x; } } enum H : S { a=S(0), b}
Created attachment 443 [details] enum.c for DMD2.032 Fixes many of the problems with enums. Tested with the pre-release DMD2.032 beta. D2 only.
Created attachment 444 [details] enum.c for DMD2.032 Revised enum.c. The version I posted was incorrect, and failed one of the test suite tests. This version passes.
The order in which those two functions are called shouldn't matter. The actual problem is the TypeEnum doesn't have proper overrides for isreal, isimaginary, etc. Will fix.
Fixed dmd 2.033