On Thursday, 19 January 2017 at 02:00:10 UTC, Ali Çehreli wrote:
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?


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

If you try:

void main() {
    alias TestType = ulong; // won't compile if = ubyte
    import std.stdio;
    TestType a,b,c;
    readf("%s %s %s ", &a, &b, &c);
    final switch(c){
        case a: writeln("a");break;
        case b: writeln("b");break;
        default: assert(false);
    }
}

Then the error message:

test.d(7): Error: case variables not allowed in final switch statements test.d(8): Error: case variables not allowed in final switch statements

Makes it looks like that "case variable" is an intended feature.

Reply via email to