Bug 4629 – BufferedFile.printf() wants char[] as first argument
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2010-08-11T19:38:00Z
Last change time
2012-04-24T18:29:53Z
Keywords
rejects-valid
Assigned to
andrei
Creator
bearophile_hugs
Comments
Comment #0 by bearophile_hugs — 2010-08-11T19:38:30Z
Using dmd 2.048 on this code:
import std.stream: BufferedFile, FileMode;
void main() {
auto f = new BufferedFile("testfile.t", FileMode.Out);
f.printf("%d\n", 10);
f.close();
}
It shows the errors:
test.d(4): Error: function std.stream.Stream.printf (char[] format,...) is not callable using argument types (string,int)
test.d(4): Error: cannot implicitly convert expression ("%d\x0a") of type string to char[]
This gives no errors:
f.printf(cast(char[])"%d\n", 10);
Comment #1 by andrej.mitrovich — 2010-08-29T18:42:59Z
Casting a string literal to a char[] is esentially undefined behavior. If you need a char[] out of a string literal, use .dup:
import std.stream: BufferedFile, FileMode;
void main()
{
auto f = new BufferedFile("testfile.t", FileMode.Out);
f.printf("%d\n".dup, 10);
f.close();
}
I'm guessing printf takes a char[] due to it's C heritage? So far I've seen a lot of D1 code that uses char[] and when porting it to D2 one needs to either change all declarations/arguments to use a string, or at the very least use .dup when passing string literals to functions taking char[].
(In reply to comment #0)
> Using dmd 2.048 on this code:
>
>
> import std.stream: BufferedFile, FileMode;
> void main() {
> auto f = new BufferedFile("testfile.t", FileMode.Out);
> f.printf("%d\n", 10);
> f.close();
> }
>
>
> It shows the errors:
> test.d(4): Error: function std.stream.Stream.printf (char[] format,...) is not
> callable using argument types (string,int)
> test.d(4): Error: cannot implicitly convert expression ("%d\x0a") of type
> string to char[]
>
>
> This gives no errors:
> f.printf(cast(char[])"%d\n", 10);