aboutsummaryrefslogtreecommitdiff
path: root/tests/conformance/6-ownership/drop_gc_resurrect.zc
diff options
context:
space:
mode:
Diffstat (limited to 'tests/conformance/6-ownership/drop_gc_resurrect.zc')
-rw-r--r--tests/conformance/6-ownership/drop_gc_resurrect.zc21
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