The code below throws a FormatException but reports an error from the library source instead of reporting the error from the offending line in the user program. Also, a more informative error message would help. import std.stdio; void main() { writef("%*10d", 100); } std.format.FormatException@std/format.d(978): $ expected ---------------- ??:? pure @safe bool std.exception.enforceEx!(std.format.FormatException).enforceEx!(bool).enforceEx(bool, lazy immutable(char)[], immutable(char)[], ulong) [0x43773e] ??:? pure @safe void std.format.FormatSpec!(char).FormatSpec.fillUp() [0x447503] ??:? @safe bool std.format.FormatSpec!(char).FormatSpec.writeUpToNextSpec!(std.stdio.File.LockingTextWriter).writeUpToNextSpec(std.stdio.File.LockingTextWriter) [0x43812b] ??:? @safe uint std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, int).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), int) [0x436f51] ??:? @safe void std.stdio.File.writef!(char, int).writef(const(char[]), int) [0x436e87] ??:? @safe void std.stdio.writef!(immutable(char)[], int).writef(immutable(char)[], int) [0x436deb] ??:? _Dmain [0x436d9f] ??:? _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv [0x443c7a] ??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x443bd0] ??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll() [0x443c36] ??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x443bd0] ??:? _d_run_main [0x443b2d] ??:? main [0x43f88d] ??:? __libc_start_main [0x7a34460f] =============== Additional Info DMD64 D Compiler v2.069 Linux sphere-0 4.1.12-1-MANJARO #1 SMP PREEMPT Tue Oct 27 22:11:47 UTC 2015 x86_64 GNU/Linux
Just for reference, you can now use a compile-time format string - you get an error for the right source line (after the first error): writef!"%*10d"(100); /dlang/dmd/src/phobos/std/stdio.d(3878): Error: static assert: "$ expected" onlineapp.d(5): instantiated from here: writef!("%*10d", int) Fixing this issue could still be useful for runtime format strings.
(In reply to ric from comment #0) > The code below throws a FormatException but reports an error from the > library source instead of reporting the error from the offending line in the > user program. That's not true. The last line contains the error in the user program. When compiling with -g you would see there: [...] test.d:5 _Dmain [0x47437c1] > Also, a more informative error message would help. Yeah, something like "$ expected while parsing the format string" maybe?
@berni44 created dlang/phobos pull request #7899 "Fix Issue 15348 - std.stdio.writef format specifier error message" fixing this issue: - Fix Issue 15348 - std.stdio.writef format specifier error message https://github.com/dlang/phobos/pull/7899
dlang/phobos pull request #7899 "Fix Issue 15348 - std.stdio.writef format specifier error message" was merged into master: - bb64a4233a97bbed6f9b9a32fa2ef41df4c398f3 by berni44: Fix Issue 15348 - std.stdio.writef format specifier error message https://github.com/dlang/phobos/pull/7899