Now that's a DIP that could use some love

Andrei Alexandrescu SeeWebsiteForEmail at
Mon Sep 14 15:28:29 UTC 2020

On 9/13/20 8:00 PM, Adam D. Ruppe wrote:
> On Sunday, 13 September 2020 at 22:29:00 UTC, Andrei Alexandrescu wrote:
>> Solves a long-standing, difficult problem of outputting meaningful, 
>> useful error messages.
> Since this was written, the compiler's output has improved significantly.
> ---
> void foo(T)() if(true && is(T == string)) {}
> void foo(T)() if(false && is(T == float)) {}
> void main() { foo!int(); }
> ---
> $ dmd cons
> cons.d(4): Error: template cannot deduce function from argument 
> types
> (int)(), candidates are:
> cons.d(1):        foo(T)()
>    with T = int
>    must satisfy the following constraint:
>         is(T == string)
> cons.d(2):        foo(T)()
>    with T = int
>    must satisfy the following constraint:
>         false
> What benefit would it bring adding a string to it? Instead of `is(T == 
> string)` it would say "T must be a string"?

Yes, indeed the recent improvements are noticeable. On a synthetic 
example it looks all dandy, but clearly there's be a large improvement 
by allowing semantic error messages. I just happened to have 
std.algorithm.comparison opened and here are a few examples:

template among(values...)
if (isExpressionTuple!values, "All values in the among expression must 
be expressions")

auto max(T...)(T args)
if (T.length >= 2)
if (!is(CommonType!T == void), "Types "~T.stringof~" don't have a common 
type for choosing the maximum.")

(similar for min)

CommonType!(T, Ts) either(alias pred = a => a, T, Ts...)(T first, lazy 
Ts alternatives)
if (alternatives.length >= 1, "Need at least one alternative besides 
primary choice")
if (!is(CommonType!(T, Ts) == void), "Types "~AliasSeq!(T, 
Ts).stringof~" need a common type")
if (allSatisfy!(ifTestable, T, Ts), "Types "~AliasSeq!(T, Ts).stringof~" 
must be testable with the if (...) statement")

Better error messages are always a good investment.

More information about the Digitalmars-d mailing list