// expect: drop 1 same 1 1 0/ // destructors 9: a freed block's drop and its bits are cleared, so a block reused at the same address runs no old drop include rt; int n, first; int addr(int* p) { return p as int; } int clean(int* p) { unbounded { return (p[-4] & (rt.F_HASDROP | rt.F_DROPPED)) == 0; } } // the drop is set in a helper, so main has no closure and its locals take no cells from the heap int* .u armed() { int* p = rt.new(int); p.drop = fn() { n++; rt.put_s("drop "); }; return p; } fn main() { { int* p = armed(); *p = 1; first = addr(p); } rt.put_n(n); rt.put_c(32); { int* q = rt.new(int); *q = 2; if (addr(q) == first) rt.put_s("same "); else rt.put_s("moved "); rt.put_n(clean(q)); rt.put_c(32); } rt.put_n(n); rt.put_c(32); rt.put_n(rt.dcount); rt.put_c(10); return 0; } // zc0: skip