test case: ---- void foo(T)(T delegate(in Object) dlg) {} void main() { foo( (in obj) { return 15; } ); // line 6 } output: ---- test.d(6): Error: template test.foo(T) does not match any function template declaration test.d(6): Error: template test.foo(T) cannot deduce template function from argument types !()(void)
https://github.com/D-Programming-Language/dmd/pull/814
Question: Would this also allow: void foo(T)(T t, bool delegate(T) dg) { } void main() { foo(1, (i) { return true; }); } or is it limited to the return type of the delegate (or is this completely unrelated to this bug?)?
(In reply to comment #2) > Question: Would this also allow: > > void foo(T)(T t, bool delegate(T) dg) > { > } > > void main() > { > foo(1, (i) { return true; }); > } > > or is it limited to the return type of the delegate (or is this completely > unrelated to this bug?)? This is unrelated bug, and your sample is NEVER compiled. Because each parameter type inference runs in *parallel*. [1] T is deduced from argument 1 -> T is deduced to int, OK. [2] bool delegate(T) is deduced from argument (i) { return true; } -> Before template parameter type deduction, the delegate parameter i is deduced to T from template function parameter type, but T is not a real type. Then compiler cannot determine the delegate literal type. [1] succeeded but [2] failed, so whole IFTI would fail. The point is [1] and [2] runs in parallel, so they have no dependency.
That makes sense. Thank you for the explanation.
Commit pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/8dba679462b3ee58bb589aa7a6b28135191c09be Merge pull request #814 from 9rnsr/fix7713 Issue 7713 - lambda inference doesn't work on template function argument