/*
TEST_OUTPUT:
---
fail_compilation/fail10102.d(48): Error: variable `fail10102.main.m` - default construction is disabled for type `NotNull!(int*)`
fail_compilation/fail10102.d(49): Error: variable `fail10102.main.a` - default construction is disabled for type `NotNull!(int*)[3]`
fail_compilation/fail10102.d(50): Error: default construction is disabled for type `NotNull!(int*)`
fail_compilation/fail10102.d(51): Error: field `S.m` must be initialized because it has no default constructor
---
*/
struct NotNull(T)
{
    T p;
    alias p this;
    this(T p)
    {
        assert(p != null, "pointer is null");
        this.p = p;
    }
    @disable this();
    NotNull opAssign(T p)
    {
        assert(p != null, "assigning null to NotNull");
        this.p = p;
        return this;
    }
}
void main()
{
    struct S
    {
        NotNull!(int *) m;
        // should fail: an explicit constructor must be required for S
    }
    int i;
    NotNull!(int*) n = &i;
    *n = 3;
    assert(i == 3);
    n = &i;
    n += 1;
    NotNull!(int*) m;               // should fail
    NotNull!(int*)[3] a;            // should fail
    auto b = new NotNull!(int*)[3]; // should fail
    S s = S();                      // should fail
}