diff options
Diffstat (limited to 'tests/conformance/6-ownership/drop_gc_resurrect.zc')
| -rw-r--r-- | tests/conformance/6-ownership/drop_gc_resurrect.zc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/tests/conformance/6-ownership/drop_gc_resurrect.zc b/tests/conformance/6-ownership/drop_gc_resurrect.zc new file mode 100644 index 0000000..d964eba --- /dev/null +++ b/tests/conformance/6-ownership/drop_gc_resurrect.zc @@ -0,0 +1,21 @@ +// 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 |
