diff options
Diffstat (limited to 'tests/programs/temporary_borrows.zc')
| -rw-r--r-- | tests/programs/temporary_borrows.zc | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tests/programs/temporary_borrows.zc b/tests/programs/temporary_borrows.zc new file mode 100644 index 0000000..40e00ba --- /dev/null +++ b/tests/programs/temporary_borrows.zc @@ -0,0 +1,29 @@ +namespace; +include rt; + +// original allocations are released after their aliases' last expression use, across branches and loops. +word latest; int made; +unchecked char*.u message(int code) { + char* p = rt.new(2); p[0] = code; p[1] = 0; latest = p; made++; return p; +} +char* alias(char* p) { return p; } +int read(char* p) { return p[0]; } +int output(char* p) { rt.put_s(p); return 0; } +int recursive(char* p, int n) { if (n) return recursive(p, n - 1); return read(p); } +int returning() { return read(alias(message('r'))); } +fn main() { + rt.put_s(message('a')); rt.put_n(rt.isobj(latest)); rt.put_c(32); + output(message('b')); rt.put_n(rt.isobj(latest)); rt.put_c(32); + rt.put_n(read(alias(message('c')))); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + rt.put_n(alias(message('d'))[0]); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + rt.put_n(rt.eq_w(message('e'), message('e'))); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + rt.put_n(recursive(message('f'), 3)); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + int n = 0; while (n < 3 && read(message('g')) == 'g') { n++; } + rt.put_n(n); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + int skipped = 0 && read(message('h')); int yes = 1 || read(message('i')); + rt.put_n(skipped + yes); rt.put_c(32); + int choice = alias(message(0)) ? read(message('j')) : 2; + rt.put_n(choice); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + rt.put_n(returning()); rt.put_c(32); rt.put_n(rt.isobj(latest)); rt.put_c(32); + rt.put_n(made); rt.put_c(10); +} |
