Thread overview
Non-global template cannot use local lambda
Jul 23, 2012
Ali Çehreli
Jul 23, 2012
Jonathan M Davis
Jul 23, 2012
Ali Çehreli
July 23, 2012
I can't see why the following limitation:

class C
{
    void foo(alias Func)()
    {}
}

void main()
{
    auto c = new C();
    c.foo!(x => x)();  // <-- Compilation error
}

Error: template instance foo!(__lambda2) cannot use local '__lambda2(__T1)' as parameter to non-global template foo(alias Func)

Is this a bug?

I've noticed this problem in some of my online examples. The following line doesn't work with 2.059, where map() below is std.parallelism.TaskPool.map():

    auto results = map!(a => a.averageGrade)(students);

Ali

July 23, 2012
On Sunday, July 22, 2012 17:40:36 Ali Çehreli wrote:
> I can't see why the following limitation:
> 
> class C
> {
>      void foo(alias Func)()
>      {}
> }
> 
> void main()
> {
>      auto c = new C();
>      c.foo!(x => x)();  // <-- Compilation error
> }
> 
> Error: template instance foo!(__lambda2) cannot use local
> '__lambda2(__T1)' as parameter to non-global template foo(alias Func)
> 
> Is this a bug?

I'd say that it's a bug . If it's not, it definitely should  be an enhancement.

- Jonathan M Davis
July 23, 2012
On 07/22/2012 06:08 PM, Jonathan M Davis wrote:
> On Sunday, July 22, 2012 17:40:36 Ali Çehreli wrote:
>> I can't see why the following limitation:
>>
>> class C
>> {
>>       void foo(alias Func)()
>>       {}
>> }
>>
>> void main()
>> {
>>       auto c = new C();
>>       c.foo!(x =>  x)();  //<-- Compilation error
>> }
>>
>> Error: template instance foo!(__lambda2) cannot use local
>> '__lambda2(__T1)' as parameter to non-global template foo(alias Func)
>>
>> Is this a bug?
>
> I'd say that it's a bug . If it's not, it definitely should  be an enhancement.
>
> - Jonathan M Davis

Thanks and sorry for the noise. I should have checked bugzilla first:

  http://d.puremagic.com/issues/show_bug.cgi?id=3051

  http://d.puremagic.com/issues/show_bug.cgi?id=3052

This one is opened by David Simcha when implementing std.parallelism:

  http://d.puremagic.com/issues/show_bug.cgi?id=5710

Then I guess my examples used to work due to dmd bugs that must have gotten fixed during the short lambda syntax implementation.

Ali