Bug 2998 – ICE(expression.c) with floating point enum

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2009-05-17T03:46:00Z
Last change time
2015-06-09T01:27:58Z
Keywords
ice-on-valid-code, patch
Assigned to
nobody
Creator
rsinfu

Attachments

IDFilenameSummaryContent-TypeSize
443enum.cenum.c for DMD2.032text/plain9523
444enum.cenum.c for DMD2.032text/plain9419

Comments

Comment #0 by rsinfu — 2009-05-17T03:46:37Z
-------------------- 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.
Comment #1 by clugdbug — 2009-09-02T00:32:14Z
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}
Comment #2 by clugdbug — 2009-09-02T00:33:56Z
Created attachment 443 enum.c for DMD2.032 Fixes many of the problems with enums. Tested with the pre-release DMD2.032 beta. D2 only.
Comment #3 by clugdbug — 2009-09-03T00:05:58Z
Created attachment 444 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.
Comment #4 by bugzilla — 2009-10-01T10:42:10Z
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.
Comment #5 by bugzilla — 2009-10-06T02:20:50Z
Fixed dmd 2.033