Bug 7713 – lambda inference doesn't work on template function argument

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-03-15T01:58:00Z
Last change time
2012-03-20T19:51:52Z
Keywords
pull, rejects-valid
Assigned to
nobody
Creator
k.hara.pg

Comments

Comment #0 by k.hara.pg — 2012-03-15T01:58:13Z
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)
Comment #1 by k.hara.pg — 2012-03-15T21:50:30Z
Comment #2 by alex — 2012-03-15T21:56:53Z
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?)?
Comment #3 by k.hara.pg — 2012-03-15T22:49:51Z
(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.
Comment #4 by alex — 2012-03-15T22:54:41Z
That makes sense. Thank you for the explanation.
Comment #5 by github-bugzilla — 2012-03-20T14:12:18Z
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