better compile-time messages for string functors

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Jan 31 11:28:07 PST 2009


Don wrote:
> Not necessarily. Andrei can just add:
> 
> static if(__traits(compiles, mixin(comp) )) {
>   mixin(comp);
> } else {
>    // static assert is a bit broken,
>    // better to do it this way to provide a backtrace.
>    pragma(msg, "Bad predicate: " ~ comp);
>    deliberate_error_message; // t
> }
> 
> into std.functional. Which will generate a very controlled error message.
> (Doesn't work if the predicate contains mismatched parentheses, but 
> that's fixable).

I tried the above and didn't quite work. The deliberate_error_message 
would trigger an error even for valid expressions. What I have now is this:

... inside binaryFunction ...
enum testAsExpression = "{"~ElementType1.stringof
      ~" "~parm1Name~"; "~ElementType2.stringof
      ~" "~parm2Name~"; return ("~fun~");}()";
static if (__traits(compiles, mixin(testAsExpression)))
{
     enum string code = "return (" ~ fun ~ ");";
     alias typeof(mixin(testAsExpression)) ReturnType;
}
else
{
     static assert(
         false,
         "Bad binary function: " ~ fun ~ " for types "
         ~ ElementType1.stringof ~ " and "
         ~ ElementType2.stringof ~
         ". You need to use an expression using symbols "
         ~parm1Name~" and "~parm2Name~".");
}

This seems to work well but does not provide the line in the 
instantiating code. Any ideas on how to do it better?


Andrei



More information about the Digitalmars-d mailing list