Switch ignores case (?)

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Nov 23 09:33:04 PST 2016


On 11/23/16 11:28 AM, Chris wrote:
> Only one of the two cases is considered. What am I doing wrong?
>
> `
> import std.array;
> import std.conv;
> import std.stdio;
>
> void main()
> {
>   auto tokens = to!(dchar[][])(["D"d, "’"d, "Addario"d, "'"d]);
>   // Or use this below:
>   //~ dstring[] tokens = ["D"d, "’"d, "Addario"d, "'"d];
>   while (!tokens.empty)
>   {
>     switch (tokens[0])
>     {
>       case "\u2019"d:
>         writeln("Apostrophe smart " ~ tokens[0]);
>         break;
>       case "\u0027"d:
>         writeln("Apostrophe straight " ~ tokens[0]);
>         break;
>       default:
>         writeln("Other " ~ tokens[0]);
>         break;
>     }
>     tokens = tokens[1..$];
>   }
> }
> `
> Prints:
>
> Other D
> Apostrophe smart ’
> Other Addario
> Other '
>
> I would have expected:
>
> Other D
> Apostrophe smart ’
> Other Addario
> Apostrophe straight '  <== expected

I tested this locally with different ideas. This definitely looks like a 
codegen bug.

I was able to reduce it to:

void main()
{
     switch("'"d)
     {
     case "'"d:
         writeln("a");
         break;
     case "’"d:
         writeln("b");
         break;
     default:
         writeln("default");
     }
}

prints "default"

What seems to fix it is removing the case statement for the "smart 
apostrophe". So I'd look there for where the bug is triggering.

-Steve


More information about the Digitalmars-d-learn mailing list