binaryFun(alias fun)1 template binaryFun(alias fun)
2 {
3     static if (is(typeof(fun) : string))
4     {
5         auto binaryFun(E1, E2)(E1 a, E2 b)
6         {
7             return mixin(fun);
8         }
9     }
10     else
11     {
12         alias binaryFun = fun;
13     }
14 }
15 
16 class Foo(int n, alias greater = "a > b")
17 {
18     private alias binaryFun!(greater) compare;
19 
this()20     public this()
21     {
22         //assert(compare(2, 1));
23         // 'compare' -> FuncExp
24 
25         assert(this.compare(2, 1));
26         // old: 'this.compare' -> DotVarExp (e1: ThisExp, var: FuncLiteralDeclaration)
27         // new: 'this.compare' -> CommaExp (e1: ThisExp, e2: FuncExp)
28 
29         // Then, in both cases lambda->toObjFile() will run via FuncExp::toElem().
30     }
31 }
32 
main()33 void main()
34 {
35     // OK
36     auto foo1 = new Foo!(1, "a > b");
37     auto foo2 = new Foo!(2, (a, b) => a > b);
38     auto foo3 = new Foo!(3, delegate(a, b){ return a > b; });
39 
40     // OK <- NG
41     auto foo4 = new Foo!(4, (int a, int b) => a > b);
42     auto foo5 = new Foo!(5, function(int a, int b){ return a > b; });
43     auto foo6 = new Foo!(6, delegate(int a, int b){ return a > b; });
44 }
45