Bug 6226 – Switch with impossible cases

Status
NEW
Severity
enhancement
Priority
P4
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2011-06-29T17:05:15Z
Last change time
2024-12-13T17:55:39Z
Keywords
diagnostic, pull
Assigned to
No Owner
Creator
bearophile_hugs
See also
https://issues.dlang.org/show_bug.cgi?id=21460
Moved to GitHub: dmd#18349 →

Comments

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
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18349 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB