http://d.puremagic.com/issues/show_bug.cgi?id=2998
Don clugd...@yahoo.com.au changed:
What|Removed |Added
Keywords||patch
CC||clugd...@yahoo.com.au
--- Comment #1 from Don clugd...@yahoo.com.au 2009-09-02 00:32:14 PDT ---
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}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---