I faced this issue while working with custom formatting for a struct. I have reduced the error down to this test program:

import std.format, std.stdio, std.array;

struct Test1
{
    void toString(W, C)(ref W w, scope const ref FormatSpec!C fmt)
    {
pragma(msg, "Test1 function compiled with W=" ~ W.stringof);
        // formatValue(w, this, fmt);
    }
}

struct Test2
{
    void toString(W, C)(ref W w, scope const ref FormatSpec!C fmt)
    {
pragma(msg, "Test2 function compiled with W=" ~ W.stringof);
        formatValue(w, this, fmt);
    }
}

void main()
{
    Test1 t1;
    Test2 t2;

    Appender!string writer;
    auto ff = singleSpec("%s");

    formatValue(writer, t1, ff);
    formatValue(writer, t2, ff);
}

When compiled, the output is:

Test1 function compiled with W=S
Test1 function compiled with W=Appender!string
Test2 function compiled with W=S

1. Why was Test2 never compiled with W=Appender!string?
2. What is "S"?

Essentially, my custom struct was not being formatted using the toString method that I had written. Reducing the issue, it seems like a call to formatValue with the same type caused the issue. If someone can explain what I am doing wrong here, it would really help a lot.

Thanks,
Saurabh

Reply via email to