Comment #0 by bearophile_hugs — 2011-06-29T17:05:15Z
In the following code the cases 400 and 200 can't happen, because they are ouside the values range of char and byte. I suggest to raise a warning in such cases (this compiles with no errors on DMD 2.053):
void main() {
char c;
switch (c) {
case 'a': break;
case 400: break;
default:
}
byte x;
switch (x) {
case 10: break;
case 200: break;
default:
}
}
See here for real world bug cases:
http://www.viva64.com/en/d/0142/
This too generates no errors, but I think this is less often a bug:
void main() {
char c;
if (c == 400) {}
}
Comment #1 by kennytm — 2011-06-30T01:46:49Z
V551 happens because in C a 'char' can be signed and people forget that. I doubt if the same argument could apply to D.
Comment #2 by bearophile_hugs — 2011-06-30T03:34:31Z
(In reply to comment #1)
> V551 happens because in C a 'char' can be signed and people forget that. I
> doubt if the same argument could apply to D.
Mistakes happen in D too, you use a variable with a range smaller than the cases you have used in the switch. I'd like the compiler to tell me when a case is impossible, because it's probably a bug, and this warning/error doesn't damage generic code a lot because in generic code you are always able to add cases using a "static if":
switch (foo) {
case 0: break;
static if (typeof(foo).max >= 200)
case 200: break;
default:
}
Regarding your specific comment, in my second example I have used a byte. In another bug report (that's now a WONTFIX) I have argued that for the mind of most programmers (me too) a byte is an unsigned value (this is also why in C# you don't have just byte and ubyte, there is sbyte). If by mistake you think of a D byte value as an unsigned value it's easy to add a case 200, that can't happen.
Comment #3 by dlang-bot — 2019-11-22T10:05:13Z
@StianGulpen created dlang/dmd pull request #10603 "fix issue 6226 - detect impossible cases when switching on integral t…" fixing this issue:
- fix issue 6226 - detect impossible cases when switching on integral types
https://github.com/dlang/dmd/pull/10603
Comment #4 by robert.schadek — 2024-12-13T17:55:39Z