// expect: drop 8 alive 8 1 gone 1/ // destructors 6: a drop that stores this somewhere reachable revives the value; it stays usable, its drop never runs again, and a later collection reclaims it include rt; int n; word g, saved; unchecked int keep(word p) { saved = p; return 0; } fn make() { g = drop(heap(8), fn() { n++; keep(this); rt.put_s("drop "); rt.put_n(*this); rt.put_c(32); }); return 0; } fn main() { make(); g = 0; rt.gc(); rt.gc(); unchecked { word p = saved; rt.put_s("alive "); rt.put_n(p[0]); rt.put_c(32); } rt.put_n(n); rt.put_c(32); saved = 0; rt.gc(); rt.gc(); rt.put_s("gone "); rt.put_n(n); rt.put_c(10); return 0; } // zc0: skip