template curry(alias fun, alias arg) { auto curry(Ts args2) { return fun(arg, args2); } } unittest { static struct TCallable { auto opCall(A, )(A a, B b) { return a + b; } } TCallable tcallable; static assert(!is(typeof(curry!(tcallable, "5")))); } $ dmd -c -unittest test.d
NB: The problem is B isn't defined.
D parser simply ignores almost of unnecessary last comma in list like follows. enum E { A = 0, B, C, } // last comma is ignored void func(int x, int y, ){} // last comma is ignored //template X((T, U, ){} // this cannot pass parsing... void tfunc(A, B, )(A, B){}; // last comma is ignored void main() { func(1,2); // func has two parameters tfunc(1,2); // tfunc has two parameters } Then, > auto opCall(A, )(A a, B b) in struct TCallable is valid template function declaration, same as auto opCall(A)(A a, B b) But B is undefined identifier, so its instantiation fails inside is(typeof(...)).
Ah yep, forgot that the error is gagged.