On Friday, 12 June 2015 at 12:20:58 UTC, Per Nordlöw wrote:
After having seen Andrei's & Walter's talks on DConf 2015 it's
time reveal a dream of mine. It resolves around of feature that
I believe is one of the most important improvements that will
benefit aggregation of more *new* users to the D Community.
Namely a more clever DMD diagnostics when a template instantion
fails to match any template definition in the current scope.
For instance, if
f(a,b,c,d)
fails to match any of the overloads
f(a,b,c) if (PRED_1(a,b,c) && PRED_2(a,b,c))
f(a,b,c,d) if (PRED(a,b) && PRED(b,c) && PRED(c,d))
instead of saying
> Error: neither of these matched
> - f(a,b,c) if (PRED_1(a,b,c) && PRED_2(a,b,c))
> - f(a,b,c,d) if (PRED(a,b) && PRED(b,c) && PRED(c,d))
it should instead say
> Error: no template match to call of
> f(a,b,c,d)
> for neither
> - f(a,b,c) if (PRED_1(a,b,c) && PRED_2(a,b,c))
-------------
> because template restriction `PRED_2(a,b,c)` evaluate
to false
> - f(a,b,c,d) if (PRED(a,b) && PRED(b,c) && PRED(c,d))
---------
> because template restriction `PRED(b,c)` evaluated to
false
Eventhough this might be a bit tricky to get right and may
break lots of existing diagnostics (in DMD unittests), I'd say
it's definitiely worth effort. Such a feature would attract
lots of new users not used to D's advanced template
restrictions. All users, newbies aswell as experts, would be
benefit from this feature. I you DMD review guys are interested
in getting this in and helping me out on source code directions
I'd be very happy to start working on DMD PR for this.
Destroy.
This can be done yet, manually, at the library level. For example
if every check in a constraint is warped like this:
---
bool CheckAndSay(alias Fun, string diagnostic = "")()
{
enum result = Fun();
static if (!result && diagnostic.length)
pragma(msg, diagnostic);
return result;
}
---
Obviously, dmd still outputs the whole constraint in an error
message, but at the top of the error you have a clear message:
---
bool IsType(T,S)()
{
return (is(T == S));
}
void bar(T1, T2)() if (
CheckAndSay!(IsType!(float,T1), "constraint error, expected
float as T1 type") &&
CheckAndSay!(IsType!(int,T2), "constraint error, expected int
as T2 type")
)
{}
void main(string[] args)
{
bar!(byte,int)();
}
---
[+] compiler change not required.
[-] lot of things to rewrite in phobos.
However it would be certainly a great gain if DMD could be more
clever on constraint failure.