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


Reply via email to