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.
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.
(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.
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18414 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB