www.digitalmars.com         C & C++   DMDScript  

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


          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)

void main() {
    int y;
    immutable x = Foo(1, { y++; });
    writeln("Before: ", y);
    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