digitalmars.D.bugs - [Issue 12701] New: Allow disabled default construction for enums
- via Digitalmars-d-bugs (102/102) May 04 2014 https://issues.dlang.org/show_bug.cgi?id=12701
https://issues.dlang.org/show_bug.cgi?id=12701 Issue ID: 12701 Summary: Allow disabled default construction for enums Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: enhancement Priority: P1 Component: DMD Assignee: nobody puremagic.com Reporter: andrej.mitrovich gmail.com Structs have a special feature which is good for catching some bugs: ----- struct ActionStruct { disable this(); this(int state) { } } void main() { ActionStruct as; // error! } ----- Enums could also use this feature. Currently we can implement a default invalid state for enums by defining a special sentinel value as the first member, e.g.: ----- enum Action { invalid, create, destroy } Action action; ... assert(action != Action.invalid, "Uninitialized action"); ----- But the problem is the sentinel value propagates to all usage sites, for example: ----- enum Action { invalid, // sentinel create, destroy, } void make1(Action action) { final switch (action) with (Action) { case invalid: assert(0); // must list it in a final switch case create, destroy: } } void make2(Action action) { final switch (action) with (Action) { case invalid: assert(0); // must list it in a final switch case create, destroy: } } void main() { Action action; make1(action); make2(action); } ----- If we had a way to mark default construction of enums as disabled then we could avoid doing checks at every usage site. The first syntax that comes to mind is using disable for the first member: ----- enum Action { disable invalid, create, destroy, } void make1(Action action) { final switch (action) with (Action) { // does not have to list disabled member case create, destroy: } } void make2(Action action) { final switch (action) with (Action) { // does not have to list disabled member case create, destroy: } } void main() { Action action; // error here at compile-time make1(action); make2(action); } ----- --
May 04 2014