DMD 2.058:
void main(){
auto foo()pure{return new int[100];}
immutable int[] x = foo(); // ok
immutable int[] y = {return new int[100];}(); // ng
immutable int[] z = delegate{return new int[100];}(); // ng
}
The code should compile.
Comment #1 by yebblies — 2013-11-26T21:57:22Z
As delegates/nested functions, they are not strongly pure and can access mutable data in the enclosing function. It works if they are made static.
Comment #2 by timon.gehr — 2013-11-27T08:14:30Z
(In reply to comment #1)
> As delegates/nested functions, they are not strongly pure and can access
> mutable data in the enclosing function.
No, they can't because they don't.
> It works if they are made static.
That implies that this request is _valid_, not the opposite. Function literals have attributes inferred. The first step for making this pass is to even allow the 'immutable' attribute on strongly pure delegate literals.
Note that the way purity is handled for delegate literals by DMD is wrong, since it has not been updated after the meaning of 'pure' was updated.
Comment #3 by robert.schadek — 2024-12-13T17:58:23Z