digitalmars.D.bugs - [Issue 16056] New: [The D Bug Tracker]
- via Digitalmars-d-bugs (42/42) May 22 2016 https://issues.dlang.org/show_bug.cgi?id=16056
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