www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 4966] New: Loops and closures break immutable

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4966

           Summary: Loops and closures break immutable
           Product: D
           Version: D2
          Platform: Other
        OS/Version: All
            Status: NEW
          Keywords: wrong-code
          Severity: critical
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: nfxjfg gmail.com



Closures referencing immutable variables declared inside a loop can observe how
these immutable values are changing - this should be impossible according to
the definition of "immutable".

$ cat closure.d
import std.stdio;

void main() {
    void delegate() res;
    foreach (i; 0..2) {
        immutable v = i;
        void printi() {
            writefln("ptr=%x value=%d", &v , v);
        }
        if (i == 0) {
            res = &printi;
            res();
        }
    }
    res();
}

$ dmd closure.d
$ ./closure
ptr=b75bae44 value=0
ptr=b75bae44 value=1

As you can see, an immutable variable changed its value. The code above is
SafeD clean, i.e. doesn't use any dirty tricks that would subvert the
typesystem. (Except printing the pointer address, which is just for
demonstrating that it's the same value.)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 01 2010
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4966


Bruno Medeiros <bdom.pub+deebugz gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bdom.pub+deebugz gmail.com
         Resolution|                            |DUPLICATE



08:59:45 PST ---
There is not just one variable 'v', there are several "instances" of variable
'v', each of them created on each iteration of the loop. Each of them is
immutable during its lifecycle (and cease to exist after their lifecycle, by
definition).

The orthogonal solution is:
 * make each 'v' variable be heap-allocated (have unscoped lifecycle). This is
consistent to how variables work in the top scope in functions.

I'm starting to reconsider though, if closures should automatically make
variables be heap-allocated. Maybe its best to require a keyword/annotation in
such referenced variables, and make the code not compile if such keywords is
not present.

*** This issue has been marked as a duplicate of issue 2043 ***

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