https://issues.dlang.org/show_bug.cgi?id=17420
Issue ID: 17420 Summary: std.format.formatObject doesn't work with @safe toString Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: phobos Assignee: nob...@puremagic.com Reporter: j...@jackstouffer.com In order to speed up formatting, std.format allows for the following overloads of toString to be defined const void toString(scope void delegate(const(char)[]) sink, FormatSpec fmt); const void toString(scope void delegate(const(char)[]) sink, string fmt); const void toString(scope void delegate(const(char)[]) sink); This allows std format to skip an allocation because the output string of the object/struct is written directly to the writer. The problem is that formatObject doesn't work with any of the common function attributes `pure @safe @nogc nothrow`. If the toString overload is marked with any of these, hasToString!(YourType) == 0 or it skips your overload and uses the allocating version. Either 1. hasToString needs to be modified to recognize these overloads if it's possible to make the existing format code call safe code 2. Failing that, a couple of new specializations of toString should be defined that is more idiomatic of Phobos that gives the function an OutputRange directly, like so const void toString(O)(O sink, FormatSpec fmt) if (isOutputRange!(O, char)); const void toString(O)(O sink, string fmt) if (isOutputRange!(O, char)); const void toString(O)(O sink) if (isOutputRange!(O, char)); --