[Issue 17463] New: format!(): variable __result cannot be read at compile time
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Fri Jun 2 04:50:46 PDT 2017
https://issues.dlang.org/show_bug.cgi?id=17463
Issue ID: 17463
Summary: format!(): variable __result cannot be read at compile
time
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: belka at 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
{
invariant
{
}
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)
{
write("asdf");
}
}
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
write(...)
- 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
compile-time";
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");
}
--
More information about the Digitalmars-d-bugs
mailing list