Thread overview
[Bug 51] New: String cast overrides the char type of decorated string literals.
Mar 14, 2006
d-bugmail
Mar 19, 2006
Thomas Kuehne
Mar 19, 2006
d-bugmail
Jul 12, 2006
Thomas Kuehne
March 14, 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=51

           Summary: String cast overrides the char type of decorated string
                    literals.
           Product: D
           Version: 0.149
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: minor
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: daiphoenix@lycos.com


Observe the following code:

  char[6] cstr = "123456"c;
  auto str1 = cast(wchar[3])(cstr);
  auto str2 = cast(wchar[3])("123456"c);

  writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
  // prints: str1: 6 : 123456
  writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
  // prints: str2: 6 : ?1?2?3

One would expect the same behaviour from str1 and str2, however the cast(wchar[3]) in str2 overrides the string decorator 'c', and makes the string literal "123456" (i.e. the string "instance" data) be of type wchar[6] instead of char[6].


-- 

March 19, 2006
d-bugmail@puremagic.com schrieb am 2006-03-14:
> Observe the following code:
>
>   char[6] cstr = "123456"c;
>   auto str1 = cast(wchar[3])(cstr);
>   auto str2 = cast(wchar[3])("123456"c);
>
>   writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
>   // prints: str1: 6 : 123456
>   writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
>   // prints: str2: 6 : ?1?2?3
>
> One would expect the same behaviour from str1 and str2, however the cast(wchar[3]) in str2 overrides the string decorator 'c', and makes the string literal "123456" (i.e. the string "instance" data) be of type wchar[6] instead of char[6].

This might seem confusing, but is the correct behaviour. http://www.digitalmars.com/d/arrays.html

# The type of a string is determined by the semantic phase of
# compilation. The type is one of: char[], wchar[], dchar[], and is
# determined by implicit conversion rules. If there are two equally
# applicable implicit conversions, the result is an error. To
# disambiguate these cases, a cast is appropriate:
#
# cast(wchar [])"abc"	// this is an array of wchar characters

Thomas


March 19, 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=51





------- Comment #2 from daiphoenix@lycos.com  2006-03-19 04:30 -------
(In reply to comment #1)
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> This might seem confusing, but is the correct behaviour.
> http://www.digitalmars.com/d/arrays.html
> # The type of a string is determined by the semantic phase of
> # compilation. The type is one of: char[], wchar[], dchar[], and is
> # determined by implicit conversion rules. If there are two equally
> # applicable implicit conversions, the result is an error. To
> # disambiguate these cases, a cast is appropriate:
> #
> # cast(wchar [])"abc"   // this is an array of wchar characters
> Thomas
> -----BEGIN PGP SIGNATURE-----
> iD8DBQFEHRi13w+/yD4P9tIRAmgpAJ9F/KNd1JSBTBOp1QME7RA6Lwja9wCfT7Gx
> SlkT9jiEQ1rxtIl/cc7wT7s=
> =aqz7
> -----END PGP SIGNATURE-----

That behaviour is true for undecorated string literals, however for decorated
string literals (i.e. those with postfix 'c', 'd', or 'w') it is not so. In
http://www.digitalmars.com/d/lex.html#stringliteral it is said: "The optional
Postfix character gives a specific type to the string, rather than it being
inferred from the context. ..."
Thus postfix-decorated string literals should not be vulnerable to type change
due to casts or other context influences, no?


-- 

July 12, 2006
d-bugmail@puremagic.com schrieb am 2006-03-14:
> http://d.puremagic.com/bugzilla/show_bug.cgi?id=51

> Observe the following code:
>
>   char[6] cstr = "123456"c;
>   auto str1 = cast(wchar[3])(cstr);
>   auto str2 = cast(wchar[3])("123456"c);
>
>   writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
>   // prints: str1: 6 : 123456
>   writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
>   // prints: str2: 6 : ?1?2?3
>
> One would expect the same behaviour from str1 and str2, however the cast(wchar[3]) in str2 overrides the string decorator 'c', and makes the string literal "123456" (i.e. the string "instance" data) be of type wchar[6] instead of char[6].

Added to DStress as http://dstress.kuehne.cn/run/s/string_postfix_07_A.d http://dstress.kuehne.cn/run/s/string_postfix_07_B.d

Thomas