On Thu, 28 Mar 2013 04:34:36 -0400, Jacob Carlborg <[email protected]> wrote:

The following code fails to compile:

void foo (inout int[] arr)
{
     auto dg = {
         foreach (i, e ; arr) {}
     };
     dg();
}

void main ()
{
     auto a = [3, 4, 5];
     foo(a);
}

Error message:

main.d(9): Error: variable main.foo.__lambda1.__aggr1174 inout variables can only be declared inside inout functions main.d(9): Error: variable main.foo.__lambda1.e inout variables can only be declared inside inout functions

If I remove the delegate everything compiles. Am I doing something wrong?


Like Timon said, it's a bug in inout design.

I'm not sure what __aggr1174 is, but you can fix the e error by specifying the type for e (or specifying it as const).

I'm assuming the issue is that the compiler is trying to generate a struct to hold the stack data for foo, and struct members cannot be inout.

It is a difficult problem to solve, because inout has two meanings depending on whether it is a parameter/return or a local variable. At some point, we need to address this, because inout has so much potential, but suffers from some large deficiencies.

-Steve

Reply via email to