[Issue 11886] "cannot access frame" error on lambda in lambda

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Jan 9 18:08:15 PST 2014


https://d.puremagic.com/issues/show_bug.cgi?id=11886


Kenji Hara <k.hara.pg at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|rejects-valid               |
           Severity|regression                  |enhancement


--- Comment #1 from Kenji Hara <k.hara.pg at gmail.com> 2014-01-09 18:08:11 PST ---
The change is introduced by fixing bug 9050 (5fb19ce). But it's not a
regression.

With old versions, the OP code had been *wrongly* accepted. So it was
accepts-invalid bug. The error message is intended and reject invalid code
expectedly.

===

To be things more clear, I'd explain a current limitation.

Currently, D/dmd does not support nested context inference for indirectly
instantiated template lambdas. It is known limitation (at least to me).
For example following case does not work:

struct Lambda(alias fun)
{
    auto opCall(A...)(A args) { return fun(args); } // Line 3
}
void main()
{
    int n = 10;
    Lambda!(x => x + n) f;
    assert(f(1) == 11); // Line 9
}

Output:
test.d(3): Error: function test.main.Lambda!((x) => x +
n).Lambda.opCall!(int).opCall cannot access frame of function D main
test.d(9): Error: template instance test.main.Lambda!((x) => x +
n).Lambda.opCall!(int) error instantiating

The template lambda x => x + n has context access (reading local variable n
declared in main).
But, until Lambda.opCall is instantiated, the 'nestedness' is unknown.
Therefore compiler won't supply hidden member for Lambda!(x => x + n) struct
object.
Finally, f(1) will call `fun` from instantiated opCall method, but it does not
know the context pointer of main function, so fun(args) makes the error "cannot
access frame of function D main".

Because of the limitation, currently it is impossible to create polymorpthic
lambda by using existing language primitives.

===

The OP code hits the limitation. By the dmd bug, it had been wrongly accepted.
But currently it is fixed and expectedly rejected.

So, I'll change this issue to 'enhancement'.

-- 
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list