[Issue 22497] Spurious dual-context error

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 10 17:45:54 UTC 2021


https://issues.dlang.org/show_bug.cgi?id=22497

--- Comment #2 from Andrei Alexandrescu <andrei at erdani.com> ---
(In reply to kinke from comment #1)
> AFAIK, the problem is that the alias template parameter doesn't capture the
> context if bound to a nested function, unlike a delegate runtime parameter.
> `canon!"abc".fun!<delegateLambda>` would need a hidden context runtime
> parameter to forward to the lambda invocation:
> 
> auto canon!"abc".fun!<lambda>(void* __lambda_context, int x) {
>     return <lambda>(__lambda_context, x);
> }
> 
> void main() {
>     int x = 42;
>     canon!"abc".fun!(y => y + x)(<main_context>, 1);
> }

Not sure I understand but hopefully it's something that can be fixed, right?

Things would be different if the template itself took an alias parameter that
could be bound to a distinct context. But it being a string makes all the
difference.

Also forgot to mention that this code also doesn't work but for a different
reason:

template canon(string v) {
    static auto fun(alias lambda)(int x) {
        return lambda(x);
    }
}

alias f1 = canon!"abc".fun;

void main() {
    int x = 42;
    f1!(y => y + x)(1);
}

Error: `static` function `onlineapp.main.f1!((y) => y + x).fun` cannot access
delegate `__lambda2` in frame of function `D main`

--


More information about the Digitalmars-d-bugs mailing list