Don <> changed:

           What    |Removed                     |Added
           Keywords|                            |patch
                 CC|                            |

--- Comment #1 from Don <>  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,
        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:
------- You are receiving this mail because: -------

Reply via email to