digitalmars.D - Strange behaviour of enums in for loops
- "Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> Jul 17 2009
- "Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> Jul 17 2009
- "Nick Sabalausky" <a a.a> Jul 17 2009
- "Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> Jul 18 2009
- Max Samukha <spambox d-coding.com> Jul 18 2009
I've found what I believe to be a pretty serious bug in DMD (I've tried
it with DMD 2.031):
enum real ONE = 1.0;
for (real x=0.0; x<=10.0; x+=ONE) writeln(x);
The above loops only once, printing "0". And it gets weirder: Replace
real by double, and the program starts a near-infinite loop, spitting
out values on the order of 1e-312. Using float gives the same result as
real.
Removing "enum" from the declaration of ONE makes the program behave as
expected, as does writing "x+=1.0" in the for loop. The following works,
which means it's probably not an issue with the += operator in general:
enum real ONE = 1.0;
real x = 1.0;
x += ONE;
assert (x == 2.0);
I can't seem to find an existing report on this issue in Bugzilla, but I
find it hard to believe this hasn't been noticed before. That's why I
thought I'd bring it up here before writing a bug report.
-Lars
Jul 17 2009
Lars T. Kyllingstad wrote:I've found what I believe to be a pretty serious bug in DMD (I've tried it with DMD 2.031): enum real ONE = 1.0; for (real x=0.0; x<=10.0; x+=ONE) writeln(x); The above loops only once, printing "0".
By the way: x becomes NaN after the first iteration, which is why the loop ends. -Lars
Jul 17 2009
"Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> wrote in message news:h3pooc$13ii$1 digitalmars.com...I can't seem to find an existing report on this issue in Bugzilla, but I find it hard to believe this hasn't been noticed before. That's why I thought I'd bring it up here before writing a bug report.
Enums have historically been so screwy (buggy) in D maybe people have been avoiding them. Or, maybe I'm not the only one who insists on using "const" for constants instead of "enum", even though D1's const doesn't actually create a true constant (It'd be rare to see an attempt to use a *real* enumeration value in that mannar).
Jul 17 2009
Nick Sabalausky wrote:"Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> wrote in message news:h3pooc$13ii$1 digitalmars.com...I can't seem to find an existing report on this issue in Bugzilla, but I find it hard to believe this hasn't been noticed before. That's why I thought I'd bring it up here before writing a bug report.
Enums have historically been so screwy (buggy) in D maybe people have been avoiding them. Or, maybe I'm not the only one who insists on using "const" for constants instead of "enum", even though D1's const doesn't actually create a true constant (It'd be rare to see an attempt to use a *real* enumeration value in that mannar).
I'm using D2, and if I'm not mistaken enum is the only way to define manifest constants. It would be nice to know if anyone can reproduce this bug. In that case I'll add it to Bugzilla. -Lars
Jul 18 2009
On Sat, 18 Jul 2009 16:55:51 +0200, "Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> wrote:Nick Sabalausky wrote:"Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> wrote in message news:h3pooc$13ii$1 digitalmars.com...I can't seem to find an existing report on this issue in Bugzilla, but I find it hard to believe this hasn't been noticed before. That's why I thought I'd bring it up here before writing a bug report.
Enums have historically been so screwy (buggy) in D maybe people have been avoiding them. Or, maybe I'm not the only one who insists on using "const" for constants instead of "enum", even though D1's const doesn't actually create a true constant (It'd be rare to see an attempt to use a *real* enumeration value in that mannar).
I'm using D2, and if I'm not mistaken enum is the only way to define manifest constants. It would be nice to know if anyone can reproduce this bug. In that case I'll add it to Bugzilla. -Lars
This is obviously a bug. Please add it. A possible workaround: enum { real ONE = 1.0 } for (real x=0.0; x<=10.0; x+=ONE) writeln(x);
Jul 18 2009









"Lars T. Kyllingstad" <public kyllingen.NOSPAMnet> 