On 07/19/2018 08:12 AM, Emma wrote:

> void test(alias fn1, alias fn2)()
> {
>      fn1();
>      fn2();
> }
>
> struct Foo
> {
>      void foo()
>      {
>          test!(bar, baz);
>      }
>
>      void bar()
>      {}
>
>      void baz()
>      {}
> }
> ---
>
> If I try to compile it, dmd complains, which I guess makes sense:
>
> ---
> Error: need this for bar of type void()
> Error: need this for baz of type void()
> ---
>
> However, if I change line 13 from `test!(bar, baz);` to `test!(() =>
> bar, baz);`, it compiles and executes fine, calling both the `bar` and
> `baz` member functions.
>
> Why is this? Shouldn’t it complain about `baz` needing `this`? Does the
> lambda in the first template argument somehow “pull in” the `this`
> reference for `baz`, too?
>
> Thanks!

I think it's a compiler bug. The second template argument should be a lambda as well. When I added the following lines to test()

    pragma(msg, typeof(fn1));
    pragma(msg, typeof(fn2));

the output is different:

void delegate() @system
void()

I think it's a bug probably related to multiple local lambdas. We had similar issues in the past. Although it works as is, I recommend you make the second one a lambda as well.

Others, please confirm that it's a bug and let's create a bug report.

Ali

Reply via email to