On 06/18/2013 09:57 AM, Kenji Hara wrote:

    # Purity
    Because a lambda needs to access the frame, any function using the
    lambda trick can't be made pure:
    void foo(T)(T a) @safe
    {
         (){
             ++a;
         }();
    }
    Error: pure function 'main.foo' cannot call impure function literal
    '__lambda1'

    The workaround is to explicitly pass the arguments, *preferably*,
    shadowing them for clarity:
    void foo(int a) pure
    {
         (ref int a){
             ++a;
         }(a);
    }
    This is already *much* less convenient. Imagine if the block needed
    to access 3, 5 or even more variabes ! Also, if one of those
    variables is declared as "auto", then you bring in the "ref
    typeof(a) a" ugliness. Just no.


This is a compiler bug, and I recently fixed it in git master. Explicit
argument passing does not need anymore.

Great. Does the fix also introduce the 'immutable' storage class for function literals for the case where a strongly pure literal is wanted?

Reply via email to