www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 12701] New: Allow disabled default construction for enums

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