DMD 2.045
int main(string[] args)
{
//switch (0) { } // segfaults
switch (0) { case 0: }
//switch (0) { case 1: } // segfaults
switch (0) { case 1: default: }
switch (0) { default: }
return 0;
}
---
Seems to segfault when none of the labels inside the switch are jumped to.
Comment #1 by bugzilla — 2010-05-04T23:44:21Z
It doesn't actually segfault, it executes a HALT instruction. If there is no default in a switch, the compiler inserts one of the form:
default: HALT
The idea is that the default should not be implied as fall-through, which it does in C.
D is behaving as it is designed to.
Comment #2 by k-foley — 2010-05-05T14:21:13Z
(In reply to comment #1)
> It doesn't actually segfault, it executes a HALT instruction. If there is no
> default in a switch, the compiler inserts one of the form:
>
> default: HALT
>
> The idea is that the default should not be implied as fall-through, which it
> does in C.
>
> D is behaving as it is designed to.
http://digitalmars.com/d/2.0/statement.html#SwitchStatement
"If none of the case expressions match, and there is not a default statement, a std.switcherr.SwitchError is thrown. The reason for this is to catch the common programming error of adding a new value to an enum, but failing to account for the extra value in switch statements. This behavior is unlike C or C++."
Should sync this with the docs.