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)
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