| // https://bugzilla.gdcproject.org/show_bug.cgi?id=283 |
| // { dg-do run { target hw } } |
| |
| struct Impl |
| { |
| size_t _count; |
| } |
| |
| struct RefCountedStore |
| { |
| Impl* _store; |
| |
| void initialize() |
| { |
| import core.stdc.stdlib : malloc; |
| _store = cast(Impl*) malloc(Impl.sizeof); |
| _store._count = 1; |
| } |
| |
| bool isInitialized() |
| { |
| return _store !is null; |
| } |
| |
| void ensureInitialized() |
| { |
| if (!isInitialized) |
| initialize(); |
| } |
| } |
| |
| struct RefCounted14443 |
| { |
| RefCountedStore _refCounted; |
| |
| this(int) |
| { |
| _refCounted.initialize(); |
| } |
| |
| this(this) |
| { |
| ++_refCounted._store._count; |
| } |
| |
| ~this() |
| { |
| if (--_refCounted._store._count) |
| return; |
| |
| import core.stdc.stdlib : free; |
| free(_refCounted._store); |
| _refCounted._store = null; |
| } |
| |
| int refCountedPayload() |
| { |
| _refCounted.ensureInitialized(); |
| return 1; |
| } |
| } |
| |
| struct PathRange14443 |
| { |
| RefCounted14443 path; |
| |
| @property PathElement14443 front() |
| { |
| return PathElement14443(this, path.refCountedPayload()); |
| } |
| } |
| |
| struct PathElement14443 |
| { |
| PathRange14443 range; |
| |
| this(PathRange14443 range, int) |
| { |
| this.range = range; |
| } |
| } |
| |
| void main() |
| { |
| auto path = RefCounted14443(12); |
| if (path._refCounted._store._count != 1) |
| assert(0); |
| { |
| auto _r = PathRange14443(path); |
| if (path._refCounted._store._count != 2) |
| assert(0); |
| { |
| auto element = _r.front; |
| if (path._refCounted._store._count != 3) |
| assert(0); |
| } |
| if (path._refCounted._store._count != 2) |
| assert(0); |
| } |
| if (path._refCounted._store._count != 1) |
| assert(0); |
| } |