This code has bad usage of std.conv.parse template function.
But raised error message is less readable.
import std.conv;
void test1()
{
int value;
parse(value);
// Error: template std.conv.parse(Target,Source)
// if (isSomeChar!(ElementType!(Source)) && isIntegral!(Target))
// does not match any function template declaration
// Error: template std.conv.parse(Target,Source)
// if (isSomeChar!(ElementType!(Source)) && isIntegral!(Target))
// cannot deduce template function from argument types !()(int)
}
parse template function is overloaded, so printing template parameter and constraint is much confusing.
It should print like follows:
// Error: template std.conv.parse does not match any
// function template declaration
// Error: template std.conv.parse cannot deduce template function
// from argument types !()(int)
}
"matches more than one template declaration" error message has same problem.
void foo(T)(T val) if (is(T : int)) {}
void foo(T)(T val) if (is(T : long)) {}
void test2()
{
foo(10);
// Error: template test.foo(T) if (is(T : int)) foo(T) if (is(T : int))
// matches more than one template declaration,
// test.d(29):foo(T) if (is(T : int)) and
// test.d(30):foo(T) if (is(T : long))
should print:
// Error: template test.foo matches more than one template declaration,
// test.d(29):foo(T) if (is(T : int)) and
// test.d(30):foo(T) if (is(T : long))
}
If there is only one template function, keeping specialized error message is better.
void bar(T)(T val) if (is(T : int)) {}
void test3()
{
bar("abc");
// Error: test.bar does not match any function template declaration
// Error: template test.bar(T) if (is(T : int)) cannot deduce
// template function from argument types !()(string)
}