Thread overview
[Issue 3190] New: enum doesn't work as the increment in a for loop
Jul 20, 2009
Don
Sep 10, 2009
Don
Oct 13, 2009
Don
Oct 21, 2009
Don
July 19, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3190

           Summary: enum doesn't work as the increment in a for loop
           Product: D
           Version: 2.031
          Platform: x86_64
        OS/Version: Linux
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: bugzilla@kyllingen.net


The following should print a list of numbers from 0 to 10:

    enum real ONE = 1.0;
    real x;
    for (x=0.0; x<10.0; x+=ONE)  writeln(x);
    writeln(x);

Instead it prints:

    0
    nan

I.e. the loop is only executed once, and x is set to NaN after the first iteration. The same happens if float is used instead of real. If double is used, the program goes into a near-infinite loop, spitting out very small numbers (starting with 6.65345e-316).

The following makes the program behave as expected:
  - making ONE a normal variable instead of an enum
  - writing "enum { real ONE }" instead
  - putting the increment inside the loop body

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
July 20, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3190


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug@yahoo.com.au




--- Comment #1 from Don <clugdbug@yahoo.com.au>  2009-07-20 00:15:11 PDT ---
I suspect this is related to bug#2414 or bug#2998. There's definitely something badly wrong with D2 enum (manifest constant) assignment.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 10, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3190


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch


--- Comment #2 from Don <clugdbug@yahoo.com.au> 2009-09-10 05:34:59 PDT ---
There are two problems here.
PROBLEM 1: This problem only shows up in for() loops because the increment
condition isn't doing constant folding. This is a more general problem, which
also affects D1.

statement.c line 1160 (DMD 2.032).

    if (increment)
    {    increment = increment->semantic(sc);
    increment = resolveProperties(sc, increment);
+    increment = increment->optimize(0);
    }

This change is enough to make the bug go away, but there's another oddity:

PROBLEM 2: It only happens for enum real ONE = 1.0; but not for enum : real {
ONE = 1.0 }.
This is because expression.c DsymbolExp::semantic(Scope *sc) checks for enum
members, but not for the new D2 manifest constants. I suspect that it probably
should convert them, too, as in this second patch:

expression.c, line 2168.

    if (v)
    {
    //printf("Identifier '%s' is a variable, type '%s'\n", toChars(),
v->type->toChars());
    if (!type)
    {   type = v->type;
        if (!v->type)
        {    error("forward reference of %s %s", v->kind(), v->toChars());
        type = Type::terror;
        }
    }
+    if ((v->storage_class & STCmanifest) && v->init) {
+        e = v->init->toExpression();
+        e->semantic(sc);
+        return e;
+    }
    e = new VarExp(loc, v);
    e->type = type;
    e = e->semantic(sc);
    return e->deref();
    }

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 13, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3190


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dsimcha@yahoo.com


--- Comment #3 from Don <clugdbug@yahoo.com.au> 2009-10-13 09:12:18 PDT ---
*** Issue 3394 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3190


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


--- Comment #4 from Don <clugdbug@yahoo.com.au> 2009-10-21 06:40:59 PDT ---
Fixed DMD2.035.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------