Member function passed through template alias only requiring `this` in certain conditions?

Ali Çehreli acehreli at yahoo.com
Thu Jul 19 22:16:22 UTC 2018


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



More information about the Digitalmars-d-learn mailing list