On Monday, 25 April 2016 at 17:52:58 UTC, Andrei Alexandrescu wrote:
Idea #1: Detect and use CNF, print which clause failed
====


I prefer this one, because it should work without modifying library or user code.

Idea #2: Allow custom error messages
====

The basic idea here is to define pragma(err, "message") as an expression that formats "message" as an error and returns false. Then we can write:

R find(R, E)(R range, E elem)
if ((isInputRange!R || pragma(err, R.stringof~" must be an input range")
   &&
   (is(typeof(range == elem) == bool) || pragma(err, "..."))


Currently, there is no boolean short-cut evaluation in template constraints, see:

    bool foo()() {
        pragma(msg, "foo");
        return true;
    }

    bool bar()() {
        pragma(msg, "bar");
        return true;
    }

    void main() {
        static assert(__traits(compiles, foo() || bar()));
    }

Prints "foo" and "bar", even though bar() wouldn't need to be evaluated anymore after foo() returned true.

Reply via email to