// expect: a drop1 b drop2 3 drop3 drop10 drop11 12 t:7 t:8 9 t:9 drop12 // destructors 6.8.5, 6.15.2: reassigning an owner that still holds a value frees the old value first, running its drop; the right side is computed before the free include rt; struct t { int v; void drop() { rt.put_s("t:"); rt.put_n(this.v); rt.put_s(" "); } } int* mk(int v) { return drop(heap(v), fn() { rt.put_s("drop"); rt.put_n(*this); rt.put_s(" "); }); } fn main() { int* p = heap(1); p.drop = fn() { rt.put_s("drop"); rt.put_n(*this); rt.put_s(" "); }; rt.put_s("a "); p = heap(2); p.drop = fn() { rt.put_s("drop"); rt.put_n(*this); rt.put_s(" "); }; rt.put_s("b "); p = mk(*p + 1); rt.put_n(*p); rt.put_s(" "); int i = 10; while (i < 13) { p = mk(i); i++; } rt.put_n(*p); rt.put_s(" "); t* s = rt.new(t); s.v = 7; s = rt.new(t); s.v = 8; t* u = rt.new(t); u.v = 9; s = u; rt.put_n(s.v); rt.put_s(" "); return 0; } // zc0: skip