| /* |
| 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 |
| } |