D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 7713 - lambda inference doesn't work on template function argument
Summary: lambda inference doesn't work on template function argument
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 normal
Assignee: No Owner
URL:
Keywords: pull, rejects-valid
Depends on:
Blocks:
 
Reported: 2012-03-15 01:58 UTC by Kenji Hara
Modified: 2012-03-20 19:51 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Kenji Hara 2012-03-15 01:58:13 UTC
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 2 Alex Rønne Petersen 2012-03-15 21:56:53 UTC
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 Kenji Hara 2012-03-15 22:49:51 UTC
(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 Alex Rønne Petersen 2012-03-15 22:54:41 UTC
That makes sense. Thank you for the explanation.
Comment 5 github-bugzilla 2012-03-20 14:12:18 UTC
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