aboutsummaryrefslogtreecommitdiff
path: root/tests/conformance/6-ownership
diff options
context:
space:
mode:
Diffstat (limited to 'tests/conformance/6-ownership')
-rw-r--r--tests/conformance/6-ownership/drop_gc_cycle.zc4
-rw-r--r--tests/conformance/6-ownership/drop_gc_cycle_long.zc24
2 files changed, 26 insertions, 2 deletions
diff --git a/tests/conformance/6-ownership/drop_gc_cycle.zc b/tests/conformance/6-ownership/drop_gc_cycle.zc
index 01db6b8..d31dc6b 100644
--- a/tests/conformance/6-ownership/drop_gc_cycle.zc
+++ b/tests/conformance/6-ownership/drop_gc_cycle.zc
@@ -1,5 +1,5 @@
-// expect: 0 1 2 2 0/
-// destructors 6.15.3: two unreachable values with drops that reach each other are finalized one per collection (each is in a cycle, so nothing outside it drops first), each exactly once, then freed
+// expect: 0 2 2 2 0/
+// destructors 6.15.3: two unreachable values with drops that reach each other are both finalized in one collection (each is in a cycle, so nothing outside it drops first), each exactly once, then freed
include rt;
int n;
word g;
diff --git a/tests/conformance/6-ownership/drop_gc_cycle_long.zc b/tests/conformance/6-ownership/drop_gc_cycle_long.zc
new file mode 100644
index 0000000..3de3f1e
--- /dev/null
+++ b/tests/conformance/6-ownership/drop_gc_cycle_long.zc
@@ -0,0 +1,24 @@
+// expect: 0 5 15 5 0/
+// destructors 6.15.3: an unreachable cycle of five values with drops is finalized whole by one collection, each value once, then freed
+include rt;
+int n, sum;
+word g;
+struct node { node* next; int v; void drop() { n++; sum = sum + this.v; } }
+unchecked fn make() {
+ node* a = rt.new(node); node* p = a; int i;
+ a.v = 1;
+ for (i = 2; i <= 5; i++) { node* q = rt.new(node); q.v = i; p.next = q; p = q; }
+ p.next = a;
+ g = a;
+ return 0;
+}
+fn main() {
+ make();
+ rt.gc(); rt.put_n(n); rt.put_c(32);
+ g = 0;
+ rt.gc(); rt.put_n(n); rt.put_c(32); rt.put_n(sum); rt.put_c(32);
+ rt.gc(); rt.put_n(n); rt.put_c(32);
+ rt.put_n(rt.dcount); rt.put_c(10);
+ return 0;
+}
+// zc0: skip