www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 9909] New: Overloaded foreach can not be used in pure functions


           Summary: Overloaded foreach can not be used in pure functions
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: maximzms gmail.com

--- Comment #0 from Maksim Zholudev <maximzms gmail.com> 2013-04-09 02:57:40
PDT ---
The following code does not compile if `func` is pure
struct Foo
    int[3] arr = [1, 2, 3];

    int opApply(int delegate(ref int) loopBody)
        foreach(a; arr)
        return 0;

void func() // pure // Error!
    Foo foo;
    int sum = 0;
    foreach(f; foo)
        sum += f;

void main() {}

Pure `func` can not call impure Foo.opApply.
If `Foo.opApply` is pure then it can not call impure `loopBody`.
If `loopBody` is pure then it can not modify "external" variable `sum`.

If `sum` is defined inside loop body there is no error (even with `pure`
keyword everywhere). So I guess DMD examines `foreach` body and finds it pure
in that case.
If that is true then taking into account purity of the function containing the
loop could be a solution.
In that case one would have to define two versions of opApply: for pure and not
pure loop body.

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