import std.utf; void main() { const char[] c = ""; auto res1 = toUTFz!(const(char)*)(c); // doesn't work auto res2 = toUTFz!(const(wchar)*)(c); // works ok } D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\utf.d(1481): Error: variable std.utf.toUTFz!(const(char)*,const(char[])).toUTFz.str cannot modify const test.d(8): Error: template instance std.utf.toUTFz!(const(char)*,const(char[])) error instantiating Funny thing is it works fine with immutable: immutable char[] c = ""; auto res1 = toUTFz!(const(char)*)(c); // ok
It is compiler issue: import std.stdio; void f(S)(S str){ writeln(str); } alias f!(string) fc; alias f!(wstring) fc; void main(){ fc("foo"); // L11 //~ fc("foo"c); // works //~ auto s = "foo"; //~ fc(s); // works } //~ Compilation breaks with message: //~ bug.d(11): Error: function alias bug.f called with argument types: //~ ((string)) //~ matches both: //~ bug.f!(string).f(string str) //~ and: //~ bug.f!(immutable(wchar)[]).f(immutable(wchar)[] str)
Sorry, it's another issue.
import std.utf; const wchar[] foo = "foo"; void main() { auto wptr = toUTFz!(const(wchar)*)(foo); // NG } It would be great if toUTFz worked in *all* cases.
Well obviously, the fact that it doesn't is a bug. I expect that I'll have it fixed before the next release. I probably should have had it fixed for the last one but have been busy and didn't get around to it.
Thanks Jonathan. This kind of call is common when passing wstring constants to Win API functions.
By the way, in case you didn't notice, I should point out that thanks to the discussion on the newsgroup about it, toUTF16z is no longer scheduled for deprecation. It's still using its old implementation internally, but should be switched over to using toUTFz by the next release (which will allow it to take all of the string types). So, if your use case of toUTFz matches toUTF16z, then you can use that.
Ok good to know, this will help porting older code. Thanks.
https://github.com/D-Programming-Language/phobos/pull/279
Fixed in 2.057, thanks Jonathan.
LOL. My fix actually hasn't been checked in yet. The changes to IFTI made it completely unnecessary (and is why it works in 2.057). In fact, I just removed my fix from the pull request for adding toUTF, since there's no reason to have it anymore. The change to how IFTI deals with const and immutable arrays is moste definitely a welcome one.