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