aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGravatar zinc <zinc@downsta.ir> 2026-10-15 17:50:10 +0330
committerGravatar zinc <zinc@downsta.ir> 2026-10-15 17:50:10 +0330
commit251b0212f626d0f92eda51906d353712ef4a63b8 (patch)
tree4f0e0b0ee6b0f6d0671261a46bb2bcd15ef0f59c /tests
parentmerge work/actors: wasm seed bootstrap (seed/MANIFEST), shared copy-on-write ... (diff)
parentprescan: guess an owned return only from a local declared from new/heap, not ... (diff)
merge work/demo-fixes: analyzer ownership fixes (back links, loop-built lists, .u inference), Io.print any args, block-end borrow messages
Diffstat (limited to 'tests')
-rw-r--r--tests/conformance/3-expressions/print_varargs.zc14
-rw-r--r--tests/conformance/3-expressions/print_varargs_fresh_object.zc6
-rw-r--r--tests/conformance/6-ownership/back_link_alias.zc6
-rw-r--r--tests/conformance/6-ownership/back_link_block_ok.zc6
-rw-r--r--tests/conformance/6-ownership/back_link_cont.zc6
-rw-r--r--tests/conformance/6-ownership/back_link_cycle.zc17
-rw-r--r--tests/conformance/6-ownership/back_link_free.zc6
-rw-r--r--tests/conformance/6-ownership/back_link_glob.zc7
-rw-r--r--tests/conformance/6-ownership/back_link_move.zc7
-rw-r--r--tests/conformance/6-ownership/back_link_reasg.zc6
-rw-r--r--tests/conformance/6-ownership/back_link_ret.zc7
-rw-r--r--tests/conformance/6-ownership/borrow_outlives_block.zc21
-rw-r--r--tests/conformance/6-ownership/infer_owned_return_before_body.zc8
-rw-r--r--tests/conformance/6-ownership/infer_owned_return_borrow_first.zc10
-rw-r--r--tests/conformance/6-ownership/infer_owned_return_discarded.zc7
-rw-r--r--tests/conformance/6-ownership/infer_owned_return_global_not_owned.zc7
-rw-r--r--tests/conformance/6-ownership/infer_owned_return_mixed.zc11
-rw-r--r--tests/conformance/6-ownership/infer_owned_return_recursive.zc21
-rw-r--r--tests/conformance/6-ownership/loop_build_list_item_after_move.zc13
-rw-r--r--tests/conformance/6-ownership/loop_build_list_not_taken_back.zc13
-rw-r--r--tests/conformance/6-ownership/loop_build_list_ok.zc21
-rw-r--r--tests/conformance/6-ownership/loop_build_list_other_owner.zc13
-rw-r--r--tests/conformance/6-ownership/outer_owner_in_inner_container.zc13
-rw-r--r--tests/conformance/6-ownership/u_return_param_field.zc7
-rw-r--r--tests/conformance/6-ownership/u_return_plain_param.zc8
-rw-r--r--tests/drivers/borrow_diag_test.js9
-rw-r--r--tests/errors/alias_scope.zc2
-rw-r--r--tests/errors/plain_return.zc5
-rw-r--r--tests/xref.baseline29
29 files changed, 289 insertions, 17 deletions
diff --git a/tests/conformance/3-expressions/print_varargs.zc b/tests/conformance/3-expressions/print_varargs.zc
new file mode 100644
index 0000000..6918c8c
--- /dev/null
+++ b/tests/conformance/3-expressions/print_varargs.zc
@@ -0,0 +1,14 @@
+// expect: a b 42 -7 1.500000//name: zc/6/
+// spec 3.11.7
+include rt, std;
+char* make_name() { char* s = rt.new(3); s[0] = 'z'; s[1] = 'c'; s[2] = 0; return s; }
+fn main() {
+ float f = 1.5;
+ std.Io.print("a");
+ std.Io.println(" b ", 42, " ", -7, " ", f);
+ std.Io.println();
+ std.Io.println("name: ", make_name());
+ int x = 3;
+ std.Io.println(x * 2);
+}
+// zc0: skip
diff --git a/tests/conformance/3-expressions/print_varargs_fresh_object.zc b/tests/conformance/3-expressions/print_varargs_fresh_object.zc
new file mode 100644
index 0000000..5cba2a4
--- /dev/null
+++ b/tests/conformance/3-expressions/print_varargs_fresh_object.zc
@@ -0,0 +1,6 @@
+// expect error: a new object can't be printed
+// spec 3.11.7
+include rt, std;
+struct node { int v; };
+fn main() { std.Io.println(rt.new(node)); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_alias.zc b/tests/conformance/6-ownership/back_link_alias.zc
new file mode 100644
index 0000000..58db710
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_alias.zc
@@ -0,0 +1,6 @@
+// expect error: b: is an owned object and can't be copied into another variable
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+fn main() { node* p; { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; p = b; } rt.put_n(p.prev.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_block_ok.zc b/tests/conformance/6-ownership/back_link_block_ok.zc
new file mode 100644
index 0000000..7955081
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_block_ok.zc
@@ -0,0 +1,6 @@
+// expect: 40
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+fn main() { memdebug on; { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; a.value = 4; rt.put_n(b.prev.value); } rt.put_n(rt.memreport()); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_cont.zc b/tests/conformance/6-ownership/back_link_cont.zc
new file mode 100644
index 0000000..d8083fd
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_cont.zc
@@ -0,0 +1,6 @@
+// expect error: b: already belongs to a container
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+fn main() { node* c = rt.new(node); node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; c.next = b; rt.put_n(c.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_cycle.zc b/tests/conformance/6-ownership/back_link_cycle.zc
new file mode 100644
index 0000000..fc47100
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_cycle.zc
@@ -0,0 +1,17 @@
+// expect: 0/
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+fn main() {
+ memdebug on;
+ for (int round = 0; round < 50; round++) {
+ node* a = rt.new(node);
+ node* b = rt.new(node);
+ a.next = b;
+ b.prev = a;
+ a.value = round;
+ b.value = b.prev.value;
+ }
+ rt.put_n(rt.memreport()); rt.put_c(10);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_free.zc b/tests/conformance/6-ownership/back_link_free.zc
new file mode 100644
index 0000000..a8fb5e8
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_free.zc
@@ -0,0 +1,6 @@
+// expect error: b: used after it was given away; b borrows a, and a was freed
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+fn main() { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; rt.free(a); rt.put_n(b.prev.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_glob.zc b/tests/conformance/6-ownership/back_link_glob.zc
new file mode 100644
index 0000000..ecba2e5
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_glob.zc
@@ -0,0 +1,7 @@
+// expect error: b: is not an owner, so it can't be stored in a global
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+node* keep;
+fn main() { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; keep = b; }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_move.zc b/tests/conformance/6-ownership/back_link_move.zc
new file mode 100644
index 0000000..47490d6
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_move.zc
@@ -0,0 +1,7 @@
+// expect error: a was stored in a global or untracked memory
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+node* keep2;
+fn main() { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; keep2 = a; rt.put_n(b.prev.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_reasg.zc b/tests/conformance/6-ownership/back_link_reasg.zc
new file mode 100644
index 0000000..02709a8
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_reasg.zc
@@ -0,0 +1,6 @@
+// expect error: b: used after it was given away; b borrows a, and a was freed by reassigning it
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+fn main() { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; a = rt.new(node); a.value = 1; rt.put_n(b.prev.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/back_link_ret.zc b/tests/conformance/6-ownership/back_link_ret.zc
new file mode 100644
index 0000000..ee10fce
--- /dev/null
+++ b/tests/conformance/6-ownership/back_link_ret.zc
@@ -0,0 +1,7 @@
+// expect error: b: has to be u to be returned
+// spec 6.6
+include rt;
+struct node { int value; node* prev; node* next; };
+node* g() { node* a = rt.new(node); node* b = rt.new(node); a.next = b; b.prev = a; return b; }
+fn main() { node* x = g(); rt.put_n(x.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/borrow_outlives_block.zc b/tests/conformance/6-ownership/borrow_outlives_block.zc
new file mode 100644
index 0000000..4d9b44a
--- /dev/null
+++ b/tests/conformance/6-ownership/borrow_outlives_block.zc
@@ -0,0 +1,21 @@
+// expect error: second: borrows from head, which was freed at the end of its block (line 17)
+// spec 6.6.3
+include rt;
+
+struct node {
+ int value;
+ node* next;
+};
+
+fn main() {
+ node* second;
+ {
+ node* head = rt.new(node);
+ head.next = rt.new(node);
+ head.next.value = 1;
+ second = head.next;
+ }
+ rt.put_n(second.value);
+ rt.put_c(10);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/infer_owned_return_before_body.zc b/tests/conformance/6-ownership/infer_owned_return_before_body.zc
new file mode 100644
index 0000000..8db6b45
--- /dev/null
+++ b/tests/conformance/6-ownership/infer_owned_return_before_body.zc
@@ -0,0 +1,8 @@
+// expect: 5/0/
+// spec 6.8
+include rt;
+memdebug on;
+int use() { int* q = mk(); int v = *q; return v; }
+int* mk() { int* p = rt.new(int); *p = 5; return p; }
+fn main() { rt.put_n(use()); rt.put_c(10); rt.put_n(rt.memreport()); rt.put_c(10); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/infer_owned_return_borrow_first.zc b/tests/conformance/6-ownership/infer_owned_return_borrow_first.zc
new file mode 100644
index 0000000..e75fb10
--- /dev/null
+++ b/tests/conformance/6-ownership/infer_owned_return_borrow_first.zc
@@ -0,0 +1,10 @@
+// expect error: a borrowed parameter cannot be returned as an owned result
+// spec 6.8
+include rt;
+struct node { int v; node* next; };
+node* pick(node* other, int which) {
+ if (which) return other;
+ return rt.new(node);
+}
+fn main() { }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/infer_owned_return_discarded.zc b/tests/conformance/6-ownership/infer_owned_return_discarded.zc
new file mode 100644
index 0000000..33d51a7
--- /dev/null
+++ b/tests/conformance/6-ownership/infer_owned_return_discarded.zc
@@ -0,0 +1,7 @@
+// expect error: a new object (or a u result) can't be thrown away
+// spec 6.8
+include rt;
+struct node { int value; node* next; };
+node* make() { node* n = rt.new(node); return n; }
+fn main() { make(); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/infer_owned_return_global_not_owned.zc b/tests/conformance/6-ownership/infer_owned_return_global_not_owned.zc
new file mode 100644
index 0000000..5d7f793
--- /dev/null
+++ b/tests/conformance/6-ownership/infer_owned_return_global_not_owned.zc
@@ -0,0 +1,7 @@
+// expect: 3/
+// spec 6.8
+include rt;
+int* cache;
+int* refill() { cache = rt.new(int); *cache = 3; return cache; }
+fn main() { refill(); rt.put_n(*cache); rt.put_c(10); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/infer_owned_return_mixed.zc b/tests/conformance/6-ownership/infer_owned_return_mixed.zc
new file mode 100644
index 0000000..5216003
--- /dev/null
+++ b/tests/conformance/6-ownership/infer_owned_return_mixed.zc
@@ -0,0 +1,11 @@
+// expect error: a borrowed parameter cannot be returned as an owned result
+// spec 6.8
+include rt;
+struct node { int value; node* next; };
+node* pick(node* other, int which) {
+ node* fresh = rt.new(node);
+ if (which) return fresh;
+ return other;
+}
+fn main() { node* a = rt.new(node); node* b = pick(a, 1); rt.put_n(b.value); }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/infer_owned_return_recursive.zc b/tests/conformance/6-ownership/infer_owned_return_recursive.zc
new file mode 100644
index 0000000..1299f64
--- /dev/null
+++ b/tests/conformance/6-ownership/infer_owned_return_recursive.zc
@@ -0,0 +1,21 @@
+// expect: 1/0/
+// spec 6.8
+include rt;
+memdebug on;
+struct node { int value; node* next; };
+node* make_list(int count) {
+ node* head = rt.new(node);
+ head.value = count;
+ if (count > 1) head.next = make_list(count - 1);
+ return head;
+}
+node* last(node* list) {
+ node* cursor = list;
+ while (cursor.next) cursor = cursor.next;
+ return cursor;
+}
+fn main() {
+ { node* list = make_list(4); rt.put_n(last(list).value); rt.put_c(10); }
+ rt.put_n(rt.memreport()); rt.put_c(10);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/loop_build_list_item_after_move.zc b/tests/conformance/6-ownership/loop_build_list_item_after_move.zc
new file mode 100644
index 0000000..5346569
--- /dev/null
+++ b/tests/conformance/6-ownership/loop_build_list_item_after_move.zc
@@ -0,0 +1,13 @@
+// expect error: item: used after it was given away; item was moved into head
+// spec 6.8.5
+include rt;
+struct node { int value; node* next; };
+fn main() {
+ node* head = rt.new(node);
+ int i = 0;
+ while (i < 3) {
+ node* item = rt.new(node); item.next = head; head = item; rt.put_n(item.value); i++;
+ }
+ rt.put_n(head.value);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/loop_build_list_not_taken_back.zc b/tests/conformance/6-ownership/loop_build_list_not_taken_back.zc
new file mode 100644
index 0000000..a9fadcd
--- /dev/null
+++ b/tests/conformance/6-ownership/loop_build_list_not_taken_back.zc
@@ -0,0 +1,13 @@
+// expect error: head: is given away inside a loop that comes back around to it
+// spec 6.8.5
+include rt;
+struct node { int value; node* next; };
+fn main() {
+ node* head = rt.new(node);
+ int i = 0;
+ while (i < 3) {
+ node* item = rt.new(node); item.next = head; i++;
+ }
+ rt.put_n(head.value);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/loop_build_list_ok.zc b/tests/conformance/6-ownership/loop_build_list_ok.zc
new file mode 100644
index 0000000..5f3de5a
--- /dev/null
+++ b/tests/conformance/6-ownership/loop_build_list_ok.zc
@@ -0,0 +1,21 @@
+// expect: 7/0/
+// spec 6.8.5
+include rt;
+memdebug on;
+struct node { int value; node* next; };
+fn main() {
+ {
+ node* head = rt.new(node);
+ int i = 0;
+ while (i < 5) {
+ node* item = rt.new(node);
+ item.value = i;
+ item.next = head;
+ head = item;
+ i++;
+ }
+ rt.put_n(head.value + head.next.value); rt.put_c(10);
+ }
+ rt.put_n(rt.memreport()); rt.put_c(10);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/loop_build_list_other_owner.zc b/tests/conformance/6-ownership/loop_build_list_other_owner.zc
new file mode 100644
index 0000000..ff13262
--- /dev/null
+++ b/tests/conformance/6-ownership/loop_build_list_other_owner.zc
@@ -0,0 +1,13 @@
+// expect error: head: still owns an object; overwriting it would leak it
+// spec 6.8.5
+include rt;
+struct node { int value; node* next; };
+fn main() {
+ node* head = rt.new(node);
+ int i = 0;
+ while (i < 3) {
+ node* item = rt.new(node); node* other = rt.new(node); item.next = head; other.value = 1; head = other; i++;
+ }
+ rt.put_n(head.value);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/outer_owner_in_inner_container.zc b/tests/conformance/6-ownership/outer_owner_in_inner_container.zc
new file mode 100644
index 0000000..d9043c0
--- /dev/null
+++ b/tests/conformance/6-ownership/outer_owner_in_inner_container.zc
@@ -0,0 +1,13 @@
+// expect error: head: belongs to item, which was freed at the end of its block (line 10)
+// spec 6.8.5
+include rt;
+struct node { int value; node* next; };
+fn main() {
+ node* head = rt.new(node);
+ {
+ node* item = rt.new(node);
+ item.next = head;
+ }
+ rt.put_n(head.value);
+}
+// zc0: skip
diff --git a/tests/conformance/6-ownership/u_return_param_field.zc b/tests/conformance/6-ownership/u_return_param_field.zc
new file mode 100644
index 0000000..af8284d
--- /dev/null
+++ b/tests/conformance/6-ownership/u_return_param_field.zc
@@ -0,0 +1,7 @@
+// expect error: a borrowed parameter cannot be returned as an owned result
+// spec 6.8
+include rt;
+struct node { int v; node* next; };
+node*.u nxt(node* l) { node* c = l.next; return c; }
+fn main() { }
+// zc0: skip
diff --git a/tests/conformance/6-ownership/u_return_plain_param.zc b/tests/conformance/6-ownership/u_return_plain_param.zc
new file mode 100644
index 0000000..5aca40b
--- /dev/null
+++ b/tests/conformance/6-ownership/u_return_plain_param.zc
@@ -0,0 +1,8 @@
+// expect error: a borrowed parameter cannot be returned as an owned result
+// spec 6.8
+include rt;
+memdebug on;
+struct node { int value; node* next; };
+node*.u pick(node* other) { return other; }
+fn main() { node* a = rt.new(node); { node* b = pick(a); rt.put_n(b.value); } rt.put_n(a.value); }
+// zc0: skip
diff --git a/tests/drivers/borrow_diag_test.js b/tests/drivers/borrow_diag_test.js
index 93a7561..027b978 100644
--- a/tests/drivers/borrow_diag_test.js
+++ b/tests/drivers/borrow_diag_test.js
@@ -70,4 +70,13 @@ assert.strictEqual(d.relatedInformation[0].message, 'owner t was freed here');
text = 'include rt;\nchar* first(char* a, char* b) borrows a;\nchar* first(char* a, char* b) { return b; }\nfn main() { return 0; }\n';
d = same(text, 'borrows clause');
assert.match(d.message, /returns a borrow of b/);
+// a borrow that outlives the block its owner was freed at the end of
+text = 'include rt;\nstruct node { int v; node* next; };\nfn main() {\n\tnode* second;\n\t{\n\t\tnode* head = rt.new(node);\n\t\thead.next = rt.new(node);\n\t\tsecond = head.next;\n\t}\n\treturn second.v;\n}\n';
+d = same(text, 'block end');
+assert.match(d.message, /^second: borrows from head, which was freed at the end of its block \(line 9\)$/);
+assert.deepStrictEqual(d.range.start, at(text, 'second.v'), 'the range is the conflicting use');
+assert.ok(d.relatedInformation && d.relatedInformation.length === 2, JSON.stringify(d));
+assert.strictEqual(d.relatedInformation[0].message, 'owner head was freed at the end of this block');
+assert.strictEqual(d.relatedInformation[1].message, 'owner head is declared here');
+assert.deepStrictEqual(d.relatedInformation[1].location.range.start, at(text, 'head ='));
console.log(`ok borrow diagnostics: ${checks} cases match zy, with ranges and related owner places`);
diff --git a/tests/errors/alias_scope.zc b/tests/errors/alias_scope.zc
index b52bfa8..ee56075 100644
--- a/tests/errors/alias_scope.zc
+++ b/tests/errors/alias_scope.zc
@@ -1,7 +1,7 @@
namespace;
include rt;
-// expect: q: used after it was given away
+// expect: q: borrows from p, which was freed at the end of its block
fn main() {
let q;
{ let p = rt.new(2); q = p + 0; }
diff --git a/tests/errors/plain_return.zc b/tests/errors/plain_return.zc
index c44c533..723ab98 100644
--- a/tests/errors/plain_return.zc
+++ b/tests/errors/plain_return.zc
@@ -2,5 +2,6 @@ namespace;
include rt;
// expect: is called before its body, so its owned return can't be known there
-fn main() { return mk(); }
-fn mk() { return rt.new(1); }
+int* mk() { int* p = rt.new(int); return p; }
+fn main() { return forward(); }
+int* forward() { return mk(); }
diff --git a/tests/xref.baseline b/tests/xref.baseline
index 79e948b..2f000af 100644
--- a/tests/xref.baseline
+++ b/tests/xref.baseline
@@ -316,8 +316,8 @@ lnsz_initial
local_captured clocap_at newloc reserve_locals
local_cell capture_cell newloc reserve_locals
local_dropset drop_attach expr localdecl newloc reassign_free reserve_locals
-local_end_info assigncheck end_owner newloc reserve_locals
-local_ended assigncheck end_owner newloc reserve_locals
+local_end_info assigncheck block_end_owners end_owner newloc reserve_locals
+local_ended assigncheck block_end_owners end_owner newloc reserve_locals
local_origin assigncheck newloc reserve_locals
local_origin_mask assigncheck newloc reserve_locals
local_shadow newloc reserve_locals shadow_take shadow_use
@@ -346,7 +346,7 @@ lrsoff_initial
lsets chk_unit
lslot newloc reserve_locals
lsp ctx_pop loop_end loop_push zc_init
-lstate alias_end assigncheck backedge block_close closure end_owner fndef handup join newloc recast reserve_locals retcheck snap_cmp snap_restore touch
+lstate alias_end assigncheck backedge block_close block_end_owners closure end_owner fndef handup join newloc recast reserve_locals retcheck snap_cmp snap_restore touch
lt_at lt_note
lt_base lt_begin lt_end
lt_buf lt_begin lt_room lt_stmt
@@ -374,10 +374,10 @@ ltxt lt_note
ltxtcap lt_note
ltype array_literal_tokens closure embed_bind fndef kw_switch localdecl newloc reserve_locals
lused assigncheck luse newloc reserve_locals
-lv array_dynamic_literal array_literal_tokens bin blockexpr call chk_reset closure ctx_pop drop_attach enhcall expr field fn_begin heap_box incdec kwcall methcall newtyped postfix_tail primary rval ternary unary
+lv array_dynamic_literal array_literal_tokens bin blockexpr call chk_reset closure ctx_pop drop_attach enhcall expr field fn_begin heap_box incdec kwcall methcall newtyped postfix_tail primary printcall rval ternary unary
lvescaped closure newloc reserve_locals unary
lvi chk_reset ctx_pop field postfix_tail primary
-lvk array_dynamic_literal array_literal_tokens bin blockexpr call chk_reset closure ctx_pop drop_attach enhcall expr field fn_begin heap_box incdec kwcall methcall newtyped postfix_tail primary ternary unary
+lvk array_dynamic_literal array_literal_tokens bin blockexpr call chk_reset closure ctx_pop drop_attach enhcall expr field fn_begin heap_box incdec kwcall methcall newtyped postfix_tail primary printcall ternary unary
lvkind closure expr incdec newloc reserve_locals unary vf_effect vf_store
lvvalue newloc reserve_locals vf_store
mdbg chk_reset kw_memdebug
@@ -503,6 +503,7 @@ qp readsrc src_push srcend
qst readsrc src_push srcend
readonly_types tconst types_init
receiver_methods add_method zc_init
+ret_borrowed fndef retcheck
rsbase chk_unit
rscap chk_unit rs_put
rsn chk_unit rs_put
@@ -711,27 +712,27 @@ uname add_unop reserve_unary
uncap reserve_unary
useq add_unop reserve_unary
vislo build_image_grow chk_unit start syntax_resident
-xaf af_forget args array_cap array_dynamic_literal array_len array_literal_tokens array_pop bin call chk_reset drop_attach drop_member expr field heap_box incdec kw_share_value kwcall methcall newtyped postfix_tail primary reassign_free ternary unary
-xbor array_cap array_dynamic_literal array_len array_literal_tokens array_pop assigncheck bin blockexpr call chk_reset closure discard drop_attach drop_member enhcall field fn_begin heap_box kw_share_value kwcall methcall postfix_tail primary reassign_free ternary typearg unary
+xaf af_forget args array_cap array_dynamic_literal array_len array_literal_tokens array_pop bin call chk_reset drop_attach drop_member expr field heap_box incdec kw_share_value kwcall methcall newtyped postfix_tail primary printcall reassign_free ternary unary
+xbor array_cap array_dynamic_literal array_len array_literal_tokens array_pop assigncheck bin blockexpr call chk_reset closure discard drop_attach drop_member enhcall field fn_begin heap_box kw_share_value kwcall methcall postfix_tail primary printcall reassign_free ternary typearg unary
xc_file xc_init
xc_fn closure fndef
xc_hook xc_init
xc_on xc_init
xc_src unit_stdin
xcls array_cap array_len array_pop array_push array_resize chk_reset ctx_pop kw_asm kwcall quote_tokens
-xconst array_dynamic_literal array_literal_tokens bin call chk_reset closure drop_attach heap_box kw_share_value methcall postfix_tail primary unary
+xconst array_dynamic_literal array_literal_tokens bin call chk_reset closure drop_attach heap_box kw_share_value methcall postfix_tail primary printcall unary
xcval array_literal_tokens primary unary
-xfloat array_dynamic_literal array_len array_literal_tokens array_pop array_push array_resize bin blockexpr call closure drop_attach expr fcoerce femit ftest heap_box incdec kw_cfunc kw_for methcall postfix_tail primary reassign_free ternary unary
+xfloat array_dynamic_literal array_len array_literal_tokens array_pop array_push array_resize bin blockexpr call closure drop_attach expr fcoerce femit ftest heap_box incdec kw_cfunc kw_for methcall postfix_tail primary printcall reassign_free ternary unary
xgive argcheck args chk_reset
xlend assigncheck expr unary
-xlenloc array_len bin call closure enhcall methcall postfix_tail primary unary
+xlenloc array_len bin call closure enhcall methcall postfix_tail primary printcall unary
xprojection ctx_pop field postfix_tail primary
xshadow assigncheck call shadow_take
-xstamp array_dynamic_literal array_len bin call closure enhcall methcall newtyped postfix_tail primary unary
-xstr array_dynamic_literal array_len array_literal_tokens bin blockexpr call closure drop_attach heap_box incdec methcall postfix_tail primary reassign_free unary
-xty args array_cap array_dynamic_literal array_len array_literal_tokens array_pop array_push array_resize bin blockexpr call closure ctx_pop drop_attach drop_member enhcall expr fcoerce field ftest heap_box kw_cfunc kw_share_value kw_sizeof kw_typeof kwcall methcall newtyped postfix_tail primary reassign_free ternary unary
+xstamp array_dynamic_literal array_len bin call closure enhcall methcall newtyped postfix_tail primary printcall unary
+xstr array_dynamic_literal array_len array_literal_tokens bin blockexpr call closure drop_attach heap_box incdec methcall postfix_tail primary printcall reassign_free unary
+xty args array_cap array_dynamic_literal array_len array_literal_tokens array_pop array_push array_resize bin blockexpr call closure ctx_pop drop_attach drop_member enhcall expr fcoerce field ftest heap_box kw_cfunc kw_share_value kw_sizeof kw_typeof kwcall methcall newtyped postfix_tail primary printcall reassign_free ternary unary
xub bin
xubat bin
xvk array_dynamic_literal array_literal_tokens bin blockexpr chk_reset ctx_pop expr field fn_begin incdec kw_share_value kwcall postfix_tail primary ternary unary vf_coerce vf_effect vf_forget
xvv blockexpr primary unary vf_coerce
-xzero array_dynamic_literal array_literal_tokens bin blockexpr call closure drop_attach enhcall expr field heap_box incdec kwcall methcall newtyped postfix_tail primary ternary unary
+xzero array_dynamic_literal array_literal_tokens bin blockexpr call closure drop_attach enhcall expr field heap_box incdec kwcall methcall newtyped postfix_tail primary printcall ternary unary