Bug 6632 – toUTFz sometimes does not work with const parameters
Status
RESOLVED
Resolution
FIXED
Severity
major
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2011-09-08T17:47:00Z
Last change time
2012-01-04T21:56:09Z
Assigned to
nobody
Creator
andrej.mitrovich
Comments
Comment #0 by andrej.mitrovich — 2011-09-08T17:47:46Z
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
Comment #1 by zeljko.grk — 2011-09-09T06:36:01Z
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)
Comment #2 by zeljko.grk — 2011-09-09T06:44:55Z
Sorry, it's another issue.
Comment #3 by andrej.mitrovich — 2011-11-09T09:58:23Z
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.
Comment #4 by issues.dlang — 2011-11-09T10:19:23Z
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.
Comment #5 by andrej.mitrovich — 2011-11-09T10:51:57Z
Thanks Jonathan.
This kind of call is common when passing wstring constants to Win API functions.
Comment #6 by issues.dlang — 2011-11-12T11:00:47Z
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.
Comment #7 by andrej.mitrovich — 2011-11-12T11:24:01Z
Ok good to know, this will help porting older code. Thanks.
Comment #9 by andrej.mitrovich — 2012-01-04T06:57:43Z
Fixed in 2.057, thanks Jonathan.
Comment #10 by issues.dlang — 2012-01-04T21:56:09Z
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.