www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 16056] New: [The D Bug Tracker]

https://issues.dlang.org/show_bug.cgi?id=16056

          Issue ID: 16056
           Summary: [The D Bug Tracker]
           Product: D
           Version: D2
          Hardware: All
               URL: http://dlang.org/
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P3
         Component: dlang.org
          Assignee: nobody puremagic.com
          Reporter: eyal.lotem gmail.com

The "immutable" qualifier is not transitive, as it claims to be.

import std.stdio;

struct Foo {
    int y;
    void delegate() pure f;
}

pure void pure_func(immutable Foo foo)
{
    foo.f();
}

void main() {
    int y;
    immutable x = Foo(1, { y++; });
    writeln("Before: ", y);
    pure_func(x);
    writeln("After: ", y);
}

Prints out:
Before: 0
After: 1

A pure function with only immutable parameters should have no possible
side-effects. However, due to 'immutable' not transitively applying to
delegates' context:

A) We can have a mutable-context delegate inside an immutable struct
B) A pure function taking exclusively immutable parameters is not really pure

The fix would be to transitively apply the "immutable" qualifier to the context
type of the Foo.f delegate.

--
May 22 2016