Bug 8129 – Cannot deduce template function when using partially specified type in function parameter

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-05-21T02:14:00Z
Last change time
2012-12-20T16:45:14Z
Keywords
pull, rejects-valid
Assigned to
nobody
Creator
meh

Attachments

IDFilenameSummaryContent-TypeSize
1108lol.dReduced testcaseapplication/octet-stream250

Comments

Comment #0 by meh — 2012-05-21T02:14:45Z
Created attachment 1108 Reduced testcase I'm getting this compilation error with the attached code. /tmp/lol.d(33): Error: template lol.lol does not match any function template declaration /tmp/lol.d(21): Error: template lol.lol cannot deduce template function from argument types !(B)(OMG,void) /tmp/lol.d(33): Error: template instance lol!(B) errors instantiating template
Comment #1 by k.hara.pg — 2012-06-02T21:13:50Z
This is not UFCS issue. Proper function call shows same errors. In my opinion, the cause of problem is the inference of lambda parameters over partially specialized IFTI call. ---- class X {} class A {} class B : A {} void foo(T : A)(X x) {} void foo(T : A)(X x, void function (T) block) {} void main() { auto x = new X; //x.foo!B((a){}); // UFCS version shows same errors foo!B(x, (a){}); // Error: template test.foo does not match any function template declaration // Error: template test.foo cannot deduce template function from argument types !(B)(X,void) // Error: template instance foo!(B) errors instantiating template // Call explicitly aliased symbol still not good. alias foo!B Lol; Lol(x, (a){}); // Error: template test.foo matches more than one template declaration, test.d(5):foo(T : A) and test.d(6):foo(T : A) // Error: function expected before (), not foo!(B) of type void // But, avoiding lambda parameter inference stops errors. foo!B(x); foo!B(x, (B b){}); }
Comment #2 by k.hara.pg — 2012-06-06T04:25:11Z
*** Issue 8202 has been marked as a duplicate of this issue. ***
Comment #3 by k.hara.pg — 2012-06-06T04:29:01Z
From issue 8202: void func(T, R)(R range, T value) {} void main() { ubyte[] buffer = [0, 1, 2]; func!ushort(buffer, 915); } This is partially specialized template function problem.
Comment #4 by k.hara.pg — 2012-06-06T04:43:16Z
Comment #5 by github-bugzilla — 2012-06-11T17:15:11Z
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/4b7c17da9fe105ff46a2e816da7fabc976ab364f fix Issue 8129 - Cannot deduce template function when using partially specified type in function parameter https://github.com/D-Programming-Language/dmd/commit/8fa7bdd28f857cde150a40ff2afa600f809fcc52 Merge pull request #983 from 9rnsr/fix8129 Issue 8129 - Cannot deduce template function when using partially specified type in function parameter