xxxxxxxxxx
import std.experimental.all;
auto assumePure(T)(T t)
if (isFunctionPointer!T || isDelegate!T)
{
enum attrs = functionAttributes!T | FunctionAttribute.pure_;
return cast(SetFunctionAttributes!(T, functionLinkage!T, attrs)) t;
}
struct A
{
this();
this(size_t i) { ctors++; this.i = i; writeln("CTOR ", i); }
~this() { dtors++; writeln("DTOR ", i); }
void dbg() { ctors++; writeln("POSTBLIT ", i); }
pure this(this)
{
assumePure(&dbg)();
}
static size_t ctors = 0;
static size_t dtors = 0;
size_t i;
}
struct Range
{
//@property size_t length = 4; // Uncomment this line for a similar result!
A front() { return A(count); }
void popFront() { count++; }
empty() { return count > 3; }
size_t count = 0;
}
void main()
{
// This is never freed, apparently
{
auto tmp = Range();
tmp.array.writeln;
}
import core.memory;
GC.collect();
}
static ~this()
{
writeln(A.ctors, "ctors vs ", A.dtors, " dtors");
}