Thread overview
[Issue 10571] New: formattedWrite error with delegate and string
Jul 08, 2013
yebblies
Jul 28, 2013
yebblies
Jul 28, 2013
yebblies
July 08, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10571

           Summary: formattedWrite error with delegate and string
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody@puremagic.com
        ReportedBy: yebblies@gmail.com


--- Comment #0 from yebblies <yebblies@gmail.com> 2013-07-08 21:53:05 EST ---
I can't format a string into a delegate taking a 'const char[]'.  This seems wrong to me.

----------------------------------

import std.format;

void main()
{
    string buf;
    formattedWrite((in char[] s) { buf ~= s; }, "%s", "hello");
    assert(buf == "hello");
}

----------------------------------

DMD v2.064 DEBUG
F:\documents\desktop\d\sourcecode\phobos\std\range.d(611): Error: static assert
"Cannot put a dchar into a void delegate(const(char[])) nothrow @safe"
F:\documents\desktop\d\sourcecode\phobos\std\format.d(1752):
instantiated from here: put!(void delegate(const(char[])) nothrow @safe, dchar)
F:\documents\desktop\d\sourcecode\phobos\std\format.d(2146):
instantiated from here: formatValue!(void delegate(const(char[])) nothrow
@safe, dchar, char)
F:\documents\desktop\d\sourcecode\phobos\std\format.d(1790):
instantiated from here: formatRange!(void delegate(const(char[])) nothrow
@safe, string, char)
F:\documents\desktop\d\sourcecode\phobos\std\format.d(2996):        ... (1
instantiations, -v to show) ...
F:\documents\desktop\d\sourcecode\phobos\std\format.d(420):
instantiatedfrom here: formatGeneric!(void delegate(const(char[])) nothrow
@safe, string, char)
testx.d(7):        instantiated from here: formattedWrite!(void
delegate(const(char[]) s) nothrow @safe, char, string)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
July 28, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10571


yebblies <yebblies@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |DUPLICATE


--- Comment #1 from yebblies <yebblies@gmail.com> 2013-07-28 15:33:23 EST ---
*** This issue has been marked as a duplicate of issue 9823 ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
July 28, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10571


yebblies <yebblies@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
         Resolution|DUPLICATE                   |


--- Comment #2 from yebblies <yebblies@gmail.com> 2013-07-28 15:41:08 EST ---
Ok, maybe not.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
August 29, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10571


monarchdodra@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |monarchdodra@gmail.com


--- Comment #3 from monarchdodra@gmail.com 2013-08-29 10:27:33 PDT ---
(In reply to comment #0)
> I can't format a string into a delegate taking a 'const char[]'.  This seems wrong to me.
> 
> ----------------------------------
> 
> import std.format;
> 
> void main()
> {
>     string buf;
>     formattedWrite((in char[] s) { buf ~= s; }, "%s", "hello");
>     assert(buf == "hello");
> }
> 
> ----------------------------------

Yup. The branches char/string don't work with a delegate sink that accepts a const(char)[]. Here is a somewhat reduced case.

//----
import std.format;

void main()
{
    FormatSpec!char f;
    formatValue((const(char)[]){}, '本', f);
    formatValue((const(char)[]){}, "a", f);
}
//----

The root issue is that "formatValue" for wide characters doesn't actually work. It just calls "put" and hopes put will magically do the work :D

formatValue for strings then also fails, because it has to compile the "%r"
path (raw), which iterates over the string as a range (dchars), and then prints
these raw with formatValue(dchar), which, again, doesn't work.

The reason we haven't seen this failure in the testers yet, is that std.format is mostly unittest using Appender, and Appender *knows* how to transcode, making it a very poor choice for thorough testing.

In any case, this gets fixed by my "put" fix: https://github.com/D-Programming-Language/phobos/pull/1439

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------