www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17463] New: format!(): variable __result cannot be read at


          Issue ID: 17463
           Summary: format!(): variable __result cannot be read at compile
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: belka caraus.de

Originally the problem appeared by using 2.074's format with a compile time
format string.

Here is the code:

static import std.format;

struct SomeId

    ref SomeId write(string fmt, string value)
        return this;

    ref SomeId write(string value)
        return write("%s", value);

    void toString(scope void delegate(const(char)[]) sink)

void main()
    cast(void) format!"ID: %s"(SomeId());

Compile time error:

Error: variable __result cannot be read at compile time
main.d(30):        called from here: this.write("asdf")
/usr/include/dmd/phobos/std/format.d(3111):        called from here:
val.toString(delegate (const(char)[] s)
put(w, s);
/usr/include/dmd/phobos/std/format.d(3434):        called from here:
formatObject(w, val, f)
/usr/include/dmd/phobos/std/format.d-mixin-3800(3800):        called from here:
formatValue(w, _param_3, f)
/usr/include/dmd/phobos/std/format.d(549):        called from here:
formatNth(w, spec, cast(ulong)currentArg, _param_2)
/usr/include/dmd/phobos/std/format.d(5524):        called from here:
formattedWrite(w, fmt, _param_1)
main.d(7):        called from here: format("%s", SomeId())
main.d(9):        called from here: (*function () => null)()
main.d(37): Error: template instance main.checkFormatException!("%s", SomeId())
error instantiating

The code works if I do something of the following:
- remove invariant
- make SomeId.write(string value) return this instead of returning another
- remove the delegate argument from SomeId.toString()

The behavior isn't specific for dmd 2.074.1 and doesn't seem to be a bug in
Phobos. I could reproduce it with 2.073.2, 2.072.2, 2.071.2 and 2.070.2.

Just add the following code:

private enum ctfpMessage = "Cannot format floating point types at

package static const checkFormatException(alias fmt) =
    std.format.format(fmt, SomeId());
    return null;

and change the main function to:

void main()
    cast(void) checkFormatException!("%s");

Jun 02 2017