aboutsummaryrefslogtreecommitdiff
path: root/tests/errors
diff options
context:
space:
mode:
Diffstat (limited to 'tests/errors')
-rw-r--r--tests/errors/alias_field.zc9
-rw-r--r--tests/errors/alias_index.zc9
-rw-r--r--tests/errors/alias_plus.zc2
-rw-r--r--tests/errors/alias_scope.zc6
-rw-r--r--tests/errors/back_to_m.zc2
-rw-r--r--tests/errors/borrow_escape.zc3
-rw-r--r--tests/errors/branch_mismatch.zc3
-rw-r--r--tests/errors/child_dies.zc3
-rw-r--r--tests/errors/child_recast.zc2
-rw-r--r--tests/errors/copy_owned.zc2
-rw-r--r--tests/errors/d_into_block.zc2
-rw-r--r--tests/errors/d_kept.zc2
-rw-r--r--tests/errors/did_you_mean.zc3
-rw-r--r--tests/errors/discard_u.zc3
-rw-r--r--tests/errors/found_token.zc2
-rw-r--r--tests/errors/give_m.zc3
-rw-r--r--tests/errors/global_store.zc3
-rw-r--r--tests/errors/leak_overwrite.zc2
-rw-r--r--tests/errors/lend_d.zc4
-rw-r--r--tests/errors/loop_move.zc3
-rw-r--r--tests/errors/plain_return.zc3
-rw-r--r--tests/errors/return_m.zc3
-rw-r--r--tests/errors/tag_mismatch.zc2
-rw-r--r--tests/errors/temporary_output.zc9
-rw-r--r--tests/errors/u_dropped.zc2
-rw-r--r--tests/errors/u_skip_level.zc2
-rw-r--r--tests/errors/unchecked_touch.zc2
-rw-r--r--tests/errors/unused.zc2
-rw-r--r--tests/errors/use_after_give.zc3
29 files changed, 96 insertions, 0 deletions
diff --git a/tests/errors/alias_field.zc b/tests/errors/alias_field.zc
new file mode 100644
index 0000000..09086ca
--- /dev/null
+++ b/tests/errors/alias_field.zc
@@ -0,0 +1,9 @@
+// expect: c: used after it was given away
+struct node { int v; node* next; };
+fn main() {
+ node* p = new(node), n = new(node);
+ p.next = n;
+ node* c = p.next;
+ free(d*p);
+ return c.v;
+}
diff --git a/tests/errors/alias_index.zc b/tests/errors/alias_index.zc
new file mode 100644
index 0000000..3c036fe
--- /dev/null
+++ b/tests/errors/alias_index.zc
@@ -0,0 +1,9 @@
+// expect: c: used after it was given away
+fn main() {
+ int** list = new(int*, 2);
+ int* item = new(int);
+ list[1] = item;
+ int* c = list[1];
+ free(d*list);
+ return c[0];
+}
diff --git a/tests/errors/alias_plus.zc b/tests/errors/alias_plus.zc
new file mode 100644
index 0000000..d42d196
--- /dev/null
+++ b/tests/errors/alias_plus.zc
@@ -0,0 +1,2 @@
+// expect: q: used after it was given away
+fn main() { let p = new(2); p[0] = 1; let q = p + 0; free(d*p); return q[0]; }
diff --git a/tests/errors/alias_scope.zc b/tests/errors/alias_scope.zc
new file mode 100644
index 0000000..b51bec5
--- /dev/null
+++ b/tests/errors/alias_scope.zc
@@ -0,0 +1,6 @@
+// expect: q: used after it was given away
+fn main() {
+ let q;
+ { let p = new(2); q = p + 0; }
+ return q[0];
+}
diff --git a/tests/errors/back_to_m.zc b/tests/errors/back_to_m.zc
new file mode 100644
index 0000000..b8c160f
--- /dev/null
+++ b/tests/errors/back_to_m.zc
@@ -0,0 +1,2 @@
+// expect: x: can't be recast back to m
+fn main() { let x = new(3); d*x; m*x; return 0; }
diff --git a/tests/errors/borrow_escape.zc b/tests/errors/borrow_escape.zc
new file mode 100644
index 0000000..ce24480
--- /dev/null
+++ b/tests/errors/borrow_escape.zc
@@ -0,0 +1,3 @@
+// expect: p: is owned and can't be returned
+fn f(.m p) { return p; }
+fn main() { let x = new(1); f(x); return 0; }
diff --git a/tests/errors/branch_mismatch.zc b/tests/errors/branch_mismatch.zc
new file mode 100644
index 0000000..bd19968
--- /dev/null
+++ b/tests/errors/branch_mismatch.zc
@@ -0,0 +1,3 @@
+// expect: x: ends the branches of an if in different states
+fn take(.d p) { return p[0]; }
+fn main() { let x = new(1); if (x[0]) take(d*x); else u*x; return 0; }
diff --git a/tests/errors/child_dies.zc b/tests/errors/child_dies.zc
new file mode 100644
index 0000000..67caca9
--- /dev/null
+++ b/tests/errors/child_dies.zc
@@ -0,0 +1,3 @@
+// expect: c: used after it was given away
+fn take(.d p) { return p[0]; }
+fn main() { let p = new(2), c = new(1); p[0] = c; take(d*p); return c[0]; }
diff --git a/tests/errors/child_recast.zc b/tests/errors/child_recast.zc
new file mode 100644
index 0000000..c9ccd62
--- /dev/null
+++ b/tests/errors/child_recast.zc
@@ -0,0 +1,2 @@
+// expect: c: belongs to a container; recast the container instead
+fn main() { let p = new(2), c = new(1); p[0] = c; d*c; return 0; }
diff --git a/tests/errors/copy_owned.zc b/tests/errors/copy_owned.zc
new file mode 100644
index 0000000..862c7ef
--- /dev/null
+++ b/tests/errors/copy_owned.zc
@@ -0,0 +1,2 @@
+// expect: x: is an owned object and can't be copied
+fn main() { let x = new(1); let y = x; return y[0]; }
diff --git a/tests/errors/d_into_block.zc b/tests/errors/d_into_block.zc
new file mode 100644
index 0000000..2d7f526
--- /dev/null
+++ b/tests/errors/d_into_block.zc
@@ -0,0 +1,2 @@
+// expect: x: used after it was given away
+fn main() { let x = new(1); d*x; { x[0] = 5; } return x[0]; }
diff --git a/tests/errors/d_kept.zc b/tests/errors/d_kept.zc
new file mode 100644
index 0000000..dcbfb86
--- /dev/null
+++ b/tests/errors/d_kept.zc
@@ -0,0 +1,2 @@
+// expect: x: d object was never given away
+fn main() { let x = new(3); d*x; x[0] = 1; return 0; }
diff --git a/tests/errors/did_you_mean.zc b/tests/errors/did_you_mean.zc
new file mode 100644
index 0000000..734b903
--- /dev/null
+++ b/tests/errors/did_you_mean.zc
@@ -0,0 +1,3 @@
+// expect: did you mean 'helper'?
+fn helper(x) { return x; }
+fn main() { return helpr(1); }
diff --git a/tests/errors/discard_u.zc b/tests/errors/discard_u.zc
new file mode 100644
index 0000000..2743f9e
--- /dev/null
+++ b/tests/errors/discard_u.zc
@@ -0,0 +1,3 @@
+// expect: a new object (or a u result) can't be thrown away
+.u mk() { let p = new(1); return u*p; }
+fn main() { mk(); return 0; }
diff --git a/tests/errors/found_token.zc b/tests/errors/found_token.zc
new file mode 100644
index 0000000..73e63dc
--- /dev/null
+++ b/tests/errors/found_token.zc
@@ -0,0 +1,2 @@
+// expect: expected ';', found 'return'
+fn main() { let a = 1 return 0; }
diff --git a/tests/errors/give_m.zc b/tests/errors/give_m.zc
new file mode 100644
index 0000000..cd67896
--- /dev/null
+++ b/tests/errors/give_m.zc
@@ -0,0 +1,3 @@
+// expect: x: is m; write d*x
+fn take(.d p) { return p[0]; }
+fn main() { let x = new(3); take(x); return 0; }
diff --git a/tests/errors/global_store.zc b/tests/errors/global_store.zc
new file mode 100644
index 0000000..dc0e546
--- /dev/null
+++ b/tests/errors/global_store.zc
@@ -0,0 +1,3 @@
+// expect: x: must be d to be stored in a global
+let g;
+fn main() { let x = new(1); g = x; return 0; }
diff --git a/tests/errors/leak_overwrite.zc b/tests/errors/leak_overwrite.zc
new file mode 100644
index 0000000..d19b5fd
--- /dev/null
+++ b/tests/errors/leak_overwrite.zc
@@ -0,0 +1,2 @@
+// expect: x: still owns an object
+fn main() { let x = new(1); x = new(2); return x[0]; }
diff --git a/tests/errors/lend_d.zc b/tests/errors/lend_d.zc
new file mode 100644
index 0000000..55ac7e0
--- /dev/null
+++ b/tests/errors/lend_d.zc
@@ -0,0 +1,4 @@
+// expect: x: is d; pass it to a d parameter
+fn look(.m p) { return p[0]; }
+fn take(.d p) { return p[0]; }
+fn main() { let x = new(3); d*x; look(x); take(x); return 0; }
diff --git a/tests/errors/loop_move.zc b/tests/errors/loop_move.zc
new file mode 100644
index 0000000..df3c94a
--- /dev/null
+++ b/tests/errors/loop_move.zc
@@ -0,0 +1,3 @@
+// expect: x: is given away inside a loop that comes back around to it
+fn take(.d p) { return p[0]; }
+fn main() { let x = new(1); let i = 0; d*x; while (i < 3) { take(x); i++; } return 0; }
diff --git a/tests/errors/plain_return.zc b/tests/errors/plain_return.zc
new file mode 100644
index 0000000..e23cc51
--- /dev/null
+++ b/tests/errors/plain_return.zc
@@ -0,0 +1,3 @@
+// expect: is called before its body, so its owned return can't be known there
+fn main() { return mk(); }
+fn mk() { return new(1); }
diff --git a/tests/errors/return_m.zc b/tests/errors/return_m.zc
new file mode 100644
index 0000000..c450711
--- /dev/null
+++ b/tests/errors/return_m.zc
@@ -0,0 +1,3 @@
+// expect: q: has to be u to be returned
+.u mk(.m q) { return q; }
+fn main() { let x = new(1); let y = mk(x); return y[0]; }
diff --git a/tests/errors/tag_mismatch.zc b/tests/errors/tag_mismatch.zc
new file mode 100644
index 0000000..079f249
--- /dev/null
+++ b/tests/errors/tag_mismatch.zc
@@ -0,0 +1,2 @@
+// expect: c: its tag doesn't match its container's
+fn main() { let p = new(2), c = new(1); u*p; p[0] = c; return 0; }
diff --git a/tests/errors/temporary_output.zc b/tests/errors/temporary_output.zc
new file mode 100644
index 0000000..02a8a07
--- /dev/null
+++ b/tests/errors/temporary_output.zc
@@ -0,0 +1,9 @@
+// expect: a new object can only go straight to a d parameter; bind it to a name first
+char*.u make_text(int n) {
+ let text = new(char, n);
+ return u*text;
+}
+fn main() {
+ put_s(make_text(3));
+ return 0;
+}
diff --git a/tests/errors/u_dropped.zc b/tests/errors/u_dropped.zc
new file mode 100644
index 0000000..e1ca68a
--- /dev/null
+++ b/tests/errors/u_dropped.zc
@@ -0,0 +1,2 @@
+// expect: x: u object must leave this block
+fn main() { let x = new(3); u*x; return 0; }
diff --git a/tests/errors/u_skip_level.zc b/tests/errors/u_skip_level.zc
new file mode 100644
index 0000000..6caeeb3
--- /dev/null
+++ b/tests/errors/u_skip_level.zc
@@ -0,0 +1,2 @@
+// expect: t: is u; it can only be handed to a variable of the enclosing block
+fn main() { let r; { { let t = new(1); u*t; r = t; } } return r[0]; }
diff --git a/tests/errors/unchecked_touch.zc b/tests/errors/unchecked_touch.zc
new file mode 100644
index 0000000..141639d
--- /dev/null
+++ b/tests/errors/unchecked_touch.zc
@@ -0,0 +1,2 @@
+// expect: x: is tracked by the analyzer and can't be used in unchecked code
+fn main() { let x = new(1); unchecked { x[0] = 1; } return 0; }
diff --git a/tests/errors/unused.zc b/tests/errors/unused.zc
new file mode 100644
index 0000000..64aff1f
--- /dev/null
+++ b/tests/errors/unused.zc
@@ -0,0 +1,2 @@
+// expect: x: m object is never used
+fn main() { let x = new(3); return 0; }
diff --git a/tests/errors/use_after_give.zc b/tests/errors/use_after_give.zc
new file mode 100644
index 0000000..8a10922
--- /dev/null
+++ b/tests/errors/use_after_give.zc
@@ -0,0 +1,3 @@
+// expect: x: used after it was given away
+fn take(.d p) { return p[0]; }
+fn main() { let x = new(3); take(d*x); return x[0]; }