We can't just use Typedef!(void*) or Typedef!(int) because -=/+= will
be allowed, which shouldn't be allowed for handles. const(void*) won't
work either, because you should be allowed to assign one handle to
another and const forbids that.

struct None; // undefined struct as bottom type
alias None* HWND;
enum INVALID_HANDLE_VALUE = cast(HWND)-1;

static assert(__traits(compiles, {HWND h; h = INVALID_HANDLE_VALUE;}));
static assert(!__traits(compiles, {None n;}));
static assert(!__traits(compiles, {HWND h; ++h;}));
static assert(!__traits(compiles, {HWND h; h + 1;}));

HWND foo(HWND h)
{
    return h;
}

void main()
{
    HWND h;
    assert(h is null);
    h = foo(h);
    assert(h is null);
    h = foo(INVALID_HANDLE_VALUE);
    assert(h is INVALID_HANDLE_VALUE);
    h = foo(null);
    assert(h is null);
}

Reply via email to