aboutsummaryrefslogtreecommitdiff
path: root/tests/conformance
diff options
context:
space:
mode:
Diffstat (limited to 'tests/conformance')
-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
25 files changed, 261 insertions, 0 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