The following code does not compile: void all(string file = __FILE__, size_t line = __LINE__)(void delegate()[] dgs ...) { foreach (dg; dgs) { dg(); } } void main() { all( assert(true), ); } Error: template all cannot deduce function from argument types !()(void), candidates are: all(string file = __FILE__, ulong line = __LINE__)(void delegate()[] dgs...) Workaround: call `all!()(...)` instead of `all(...)`.
For reference, the spec describes lazy variadic functions here: http://dlang.org/spec/function.html#lazy_variadic_functions The test case doesn't need the template parameters to fail. This fails, too: ---- void all()(void delegate()[] dgs ...) {} void f() {} void main() { all(f()); } /* Error: template test.all cannot deduce function from argument types !()(void) */ ---- It works when the return type is int or another primitive type, including pointers and arrays: ---- void all()(int delegate()[] dgs ...) {} int f() { return 0; } void main() { all(f()); } /* no error */ ---- But it fails with Object and user-defined aggregates. Most peculiarly, it also fails with an alias to a primitive type: ---- alias T = int; void all()(T delegate()[] dgs ...) {} T f() { return T.init; } void main() { all(f()); } /* Error: template test.all cannot deduce function from argument types !()(int) */ ----
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19167 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB