Hi!

This is kind of bug report/question.

I'm running Ubuntu 12.04 (x64), DMD v2.064.2 and have the following code:

T identity(T)(T e) { return e; }
struct S(alias Func)
{
    void call()
    {
        import std.stdio;
        writeln(Func("string").length);
    }
}
static struct S1
{
    alias S!(identity) A1;
    //alias S!(x => x) A2;
    alias S!(function string (string e) { return e; }) A3;
}
void main()
{
    S1.A1.init.call();
    S1.A3.init.call();
}

The main complaint is that function literal is somehow broken in that case. The output of the program is
6
4527264
For some reason, length in the second case is wrong.

Another question (which I believe is reasonable) is that I cannot use the (x => x) syntax for function literal (the commented alias A2). The compilation error is:

tmp.d(15): Error: delegate tmp.S1.__lambda4!string.__lambda4 function literals cannot be class members tmp.d(8): Error: template instance tmp.S1.__lambda4!string error instantiating
tmp.d(15):        instantiated from here: S!((x) => x)
tmp.d(8): Error: this for __lambda4 needs to be type S1 not type S!((x) => x)

I assume, compiler infers the type of the literal to be delegate, but it's clearly not the case, since I don't need no context here.

I appreciate any comments.

Reply via email to