The use case is simple: template foo(T) { void foo(U)(U a, T b, T c) { } } void main() { int x; foo!(uint)(x, 0, 1); } The template engine should properly bind 0 and 1 to type uint, but it fails to do so. As a result, the entire program does not compile although it should.
If you convert the call to: foo!(uint)(x, 0u, 1u); or foo!(int)(x, 0, 1); it works. This might indicate that type conversion is not working correctly here. Either way it gives a work around to any one who just need to get something done.
No nested template is required - this is sufficient to show the problem (DMD 1.023 and 2.007, Windows): ---------- void foo(U)(U a, uint b, uint c) { } void main() { int x; foo(x, 0, 1); } ---------- bz1641a.d(6): template bz1641a.foo(U) does not match any template declaration bz1641a.d(6): template bz1641a.foo(U) cannot deduce template function from argument types (int,int,int) ---------- So the problem is that, when trying to perform IFTI, it doesn't look for implicit conversions.
With git master (1ff6ad8509), the sample codes compile without error.