digitalmars.D.bugs - 2 bugs: format / printf
- bug d.com (22/22) Aug 09 2005 I suppose format and printf accept the same format string. If you comme...
- Chris Sauls (25/40) Aug 09 2005 I'm not surprised you got errors... you are passing D-style strings and...
- bug d.com (23/63) Aug 09 2005 Maybe my choose of printf is misleading. I only want to write a small e...
-
Stewart Gordon
(7/9)
Aug 10 2005
I suppose format and printf accept the same format string. If you comment out
the line marked "here", there's a runtime error with format.
$ cat fmt.d
-----------------------------
import std.string;
int main(char[][] args)
{
byte c = -1;
char ch;
printf( "0x%02hhX\n", c ); // OK
printf(format("0x%02hhX\n", c)); // runtime Error: std.format formatArg
printf("here"~ch); // compiler crash
return 0;
}
-----------------------------
$ dmd fmt.d
gdc -c fmt.d -o fmt.o
fmt.d: In function `main':
fmt.d:9: internal compiler error: in rawArray, at d/d-codegen.cc:981
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
Aug 09 2005
bug d.com wrote:I suppose format and printf accept the same format string.Not exactly, actually.$ cat fmt.d ----------------------------- import std.string; int main(char[][] args) { byte c = -1; char ch; printf( "0x%02hhX\n", c ); // OK printf(format("0x%02hhX\n", c)); // runtime Error: std.format formatArg printf("here"~ch); // compiler crash return 0; } -----------------------------I'm not surprised you got errors... you are passing D-style strings and slices to printf, which expects C-style strings. For instance you could change this line: to this one: And change this line: to this one: Or, better yet, just import 'std.stdio' and use writef/writefln in place of printf. Then you have no problems, and can even scrap your call to format in this case. So your code becomes: -- Chris Sauls
Aug 09 2005
Maybe my choose of printf is misleading. I only want to write a small example
to show the bug.
For the 2nd bug: at any rate the compile can report errors, but should not
crash.
Let's see the new example:
$ cat fmt.d
-----------------------------
import std.string;
void doNothing(char[] s) {}
int main(char[][] args)
{
int i;
byte c = -1;
char ch;
doNothing(format("0x%02hhX\n", c)); // Error: std.format formatArg
doNothing("here"~ch); // compiler crash fmt.d:13: internal compiler error: in
rawArray, at d/d-codegen.cc:981
doNothing(format("// %d: %.*s\n", i, "there")); //Error: std.format int argument
expected
return 0;
}
-----------------------------
In article <ddb00l$9u0$1 digitaldaemon.com>, Chris Sauls says...
bug d.com wrote:
I suppose format and printf accept the same format string.
Not exactly, actually.
$ cat fmt.d
-----------------------------
import std.string;
int main(char[][] args)
{
byte c = -1;
char ch;
printf( "0x%02hhX\n", c ); // OK
printf(format("0x%02hhX\n", c)); // runtime Error: std.format formatArg
printf("here"~ch); // compiler crash
return 0;
}
-----------------------------
I'm not surprised you got errors... you are passing D-style strings and slices
to printf,
which expects C-style strings. For instance you could change this line:
to this one:
And change this line:
to this one:
Or, better yet, just import 'std.stdio' and use writef/writefln in place of
printf.
Then you have no problems, and can even scrap your call to format in this case.
So your
code becomes:
-- Chris Sauls
Aug 09 2005
Sorry, looks like format(...) do not accept format string e.g. "%d..." at all.
So the 1st and 3rd are not bug.
Only the 2nd compiler crash is a real bug.
In article <ddb81r$ihe$1 digitaldaemon.com>, bug d.com says...
Maybe my choose of printf is misleading. I only want to write a small example
to show the bug.
For the 2nd bug: at any rate the compile can report errors, but should not
crash.
Let's see the new example:
$ cat fmt.d
-----------------------------
import std.string;
void doNothing(char[] s) {}
int main(char[][] args)
{
int i;
byte c = -1;
char ch;
doNothing(format("0x%02hhX\n", c)); // Error: std.format formatArg
doNothing("here"~ch); // compiler crash fmt.d:13: internal compiler error: in
rawArray, at d/d-codegen.cc:981
doNothing(format("// %d: %.*s\n", i, "there")); //Error: std.format int argument
expected
return 0;
}
-----------------------------
In article <ddb00l$9u0$1 digitaldaemon.com>, Chris Sauls says...
bug d.com wrote:
I suppose format and printf accept the same format string.
Not exactly, actually.
$ cat fmt.d
-----------------------------
import std.string;
int main(char[][] args)
{
byte c = -1;
char ch;
printf( "0x%02hhX\n", c ); // OK
printf(format("0x%02hhX\n", c)); // runtime Error: std.format formatArg
printf("here"~ch); // compiler crash
return 0;
}
-----------------------------
I'm not surprised you got errors... you are passing D-style strings and slices
to printf,
which expects C-style strings. For instance you could change this line:
to this one:
And change this line:
to this one:
Or, better yet, just import 'std.stdio' and use writef/writefln in place of
printf.
Then you have no problems, and can even scrap your call to format in this case.
So your
code becomes:
-- Chris Sauls
Aug 09 2005
bug d.com wrote:Only the 2nd compiler crash is a real bug.Both the snippets you posted compile fine with DMD 0.129 under Windows.
Aug 10 2005
bug d.com wrote:I suppose format and printf accept the same format string. If you comment out the line marked "here", there's a runtime error with format.<snip> No, format and writef accept the same format string. Stewart. -- My e-mail is valid but not my primary mailbox. Please keep replies on on the 'group where everyone may benefit.
Aug 10 2005









Deewiant <deewiant.doesnotlike.spam gmail.com> 