August 01, 2015
https://issues.dlang.org/show_bug.cgi?id=14854

          Issue ID: 14854
           Summary: @disable this inconsistent between structs and classes
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: minor
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: issues.dlang@jmdavisProg.com

This code

class C1
{
    @disable this() {}
}

class C2
{
    @disable this();
}

struct S1
{
    @disable this() {}
}

struct S2
{
    @disable this();
}

void main()
{
}

results in this compilation error:

q.d(13): Error: constructor q.S1.this default constructor for structs only allowed with @disable and no body

For structs, it's clearly required that @disable this() not have a body, whereas for classes, for some reason, the compiler doesn't care. The error message does explicitly use the word struct, which implies that this difference is intentional, but I don't see any reason to allow for the inconsistency. It just makes it less obvious, which syntax you should be using.

And in general, I don't see any reason to allow bodies on @disabled functions. One interesting side effect of putting a body on the @disabled default constructor on a class is that it actually affects the code coverage analyzer, because the lines inside the body never run and count as uncovered.

So, I suggest that we deprecate having bodies on _all_ @disabled functions and move to making it an error like it is with @disabling the init property on a struct.

--