switch statement with variable branches

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jan 18 18:00:10 PST 2017


On 01/18/2017 05:22 PM, Yuxuan Shui wrote:
> Somehow I can't use ubyte variables behind 'case', but ulong works fine.
> Why is that?
>
> void main() {
>     alias TestType = ulong; // won't compile if = ubyte
>     import std.stdio;
>     TestType a,b,c;
>     readf("%s %s %s ", &a, &b, &c);
>     switch(c){
>         case a: writeln("a");break;
>         case b: writeln("b");break;
>         default: assert(false);
>     }
> }

case expressions must be constants:

   "The case expressions must all evaluate to a constant value or
    array, or a runtime initialized const or immutable variable of
    integral type."

   https://dlang.org/spec/statement.html#SwitchStatement

The fact that it compiles for ulong looks like a bug to me. It compiles 
probably because switch is most likely implemented in terms of a chained 
if-else-if statements by the compiler and it just works because there is 
no explicit check whether they are constant or not.

Ali



More information about the Digitalmars-d-learn mailing list