digitalmars.D.bugs - [Issue 6226] New: Switch with impossible cases
- d-bugmail puremagic.com (41/41) Jun 29 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6226
- d-bugmail puremagic.com (11/11) Jun 30 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6226
- d-bugmail puremagic.com (23/25) Jun 30 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6226
http://d.puremagic.com/issues/show_bug.cgi?id=6226
Summary: Switch with impossible cases
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Keywords: diagnostic
Severity: enhancement
Priority: P2
Component: DMD
AssignedTo: nobody puremagic.com
ReportedBy: bearophile_hugs eml.cc
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) {}
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 29 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6226
kennytm gmail.com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kennytm gmail.com
V551 happens because in C a 'char' can be signed and people forget that. I
doubt if the same argument could apply to D.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 30 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6226V551 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 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. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 30 2011









d-bugmail puremagic.com 