Bug 4158 – switch segfault

Status
RESOLVED
Resolution
INVALID
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Linux
Creation time
2010-05-04T19:49:00Z
Last change time
2015-06-09T05:15:03Z
Assigned to
nobody
Creator
k-foley

Comments

Comment #0 by k-foley — 2010-05-04T19:49:19Z
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.