| // https://issues.dlang.org/show_bug.cgi?id=21543 |
| |
| class B |
| { |
| Nullable!B data; |
| alias data this; |
| } |
| |
| void test1() |
| { |
| B b; |
| Nullable!B n; |
| } |
| |
| struct Nullable(T) |
| { |
| T payload; |
| |
| void opAssign()(T) |
| { |
| move(payload); |
| } |
| |
| inout(T) get_() inout |
| { |
| return payload; |
| } |
| |
| alias get_ this; |
| } |
| |
| // another version with chain of 3 alias this |
| |
| struct C |
| { |
| Nullable2 data; |
| alias data this; |
| } |
| |
| void test2() |
| { |
| C c; |
| Nullable2 n2 = &c; |
| Nullable3 n3 = &c; |
| |
| // these are to check a sane -vcg-ast output |
| fn1(c); |
| fn1(n2); |
| fn1(n3); |
| fn2(c); |
| fn2(n2); |
| fn2(n3); |
| fn3(c); |
| fn3(n2); |
| fn3(n3); |
| } |
| |
| void fn1(C x) {} |
| |
| void fn2(Nullable2 x) {} |
| |
| void fn3(Nullable3 x) {} |
| |
| struct Nullable2 |
| { |
| Nullable3 payload; |
| |
| this(C* c) |
| { |
| payload = Nullable3(c); |
| } |
| |
| void opAssign()(Nullable3) |
| { |
| move(payload); |
| } |
| |
| inout(Nullable3) get_() inout |
| { |
| return payload; |
| } |
| |
| alias get_ this; |
| } |
| |
| struct Nullable3 |
| { |
| C* payload; |
| |
| this(C* c) |
| { |
| payload = c; |
| } |
| |
| void opAssign()(C) |
| { |
| move(payload); |
| } |
| |
| inout(C) get_() inout |
| { |
| return *payload; |
| } |
| |
| alias get_ this; |
| } |
| |
| T move(T)(ref T source) |
| { |
| return source; |
| } |
| |
| T move(T)(T source) |
| { |
| return source; |
| } |