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

Timoses timosesu at gmail.com
Fri Jul 20 05:31:22 UTC 2018


On Thursday, 19 July 2018 at 22:16:22 UTC, Ali Çehreli wrote:
> On 07/19/2018 08:12 AM, Emma wrote:
> > [...]
> > 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()
> > ---
> >
> > [...]
>
> 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()

That is for the version of calling test with one lamdba and one 
function? (`test!(() => bar, baz)`)

Just a question: The compiler should not automatically convert 
those (functions) to lambdas?

Interesting is this:

void test(alias fn1, alias fn2)()
{
     pragma(msg, typeof(fn1)); // void delegate() @system
     pragma(msg, typeof(fn2)); // void()
     fn1();
     fn2(); // Error: this for baz needs to be type Boo not type 
Foo
}
struct Foo
{
     void foo()
     {
         test!(()=>bar, b.baz);
     }
     int i = 1337;

     struct Boo
     {
      	int j = 3;
         void baz()
     	{writeln(j);}
     }
     Boo b;

     void bar()
     {writeln(i);}
}
unittest
{
  	auto foo = Foo();
     foo.foo();
}

Looks like the compiler just assumes the context of the first 
delegate to be applicable for the second function?

>
> 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