aboutsummaryrefslogtreecommitdiff
path: root/tests/errors
diff options
context:
space:
mode:
authorGravatar zinc <zinc@downsta.ir> 2026-10-15 22:15:38 +0330
committerGravatar zinc <zinc@downsta.ir> 2026-10-15 22:15:38 +0330
commitbe43babc1886fc5efee898b2a3d0285012e511fb (patch)
treeb7ae73e7a6d4c896e2c49b7090168ef589b574af /tests/errors
parentmerge work/known-bugs: constant-expression precedence, local const in constan... (diff)
definite assignment: reading a local before it is initialized is a compile error (spec 4.1.5, b.1.9)
track linited per local alongside the ownership state; snapshots, exit records and joins carry it, and a join keeps a local set only when every reaching path set it. x = e, a declaration initializer, &x (out-parameter), a full array initializer, or using an aggregate as an address set a local; field and element writes do not set the aggregate. while/for bodies that may run zero times do not count; do/while does. compiler, runtime, std, actor and lsp sources initialize the locals the rule flagged; zc0 accepts = {} brace lists (zeroed). tests: tests/errors/uninit_*.zc, tests/conformance/4-statements/uninit_*.zc
Diffstat (limited to 'tests/errors')
-rw-r--r--tests/errors/uninit_branch.zc10
-rw-r--r--tests/errors/uninit_loop.zc11
-rw-r--r--tests/errors/uninit_partial_array.zc10
-rw-r--r--tests/errors/uninit_partial_struct.zc12
-rw-r--r--tests/errors/uninit_read.zc9
5 files changed, 52 insertions, 0 deletions
diff --git a/tests/errors/uninit_branch.zc b/tests/errors/uninit_branch.zc
new file mode 100644
index 0000000..e4d253b
--- /dev/null
+++ b/tests/errors/uninit_branch.zc
@@ -0,0 +1,10 @@
+namespace;
+include rt;
+
+// expect: x: used before it is initialized
+fn main() {
+ int x;
+ if (rt.get_c()) x = 1;
+ rt.put_n(x);
+ return 0;
+}
diff --git a/tests/errors/uninit_loop.zc b/tests/errors/uninit_loop.zc
new file mode 100644
index 0000000..d345296
--- /dev/null
+++ b/tests/errors/uninit_loop.zc
@@ -0,0 +1,11 @@
+namespace;
+include rt;
+
+// expect: x: used before it is initialized
+fn main() {
+ int x;
+ int n = 0;
+ while (n) { x = 1; n = 0; }
+ rt.put_n(x);
+ return 0;
+}
diff --git a/tests/errors/uninit_partial_array.zc b/tests/errors/uninit_partial_array.zc
new file mode 100644
index 0000000..d30310f
--- /dev/null
+++ b/tests/errors/uninit_partial_array.zc
@@ -0,0 +1,10 @@
+namespace;
+include rt;
+
+// expect: a: used before it is initialized
+fn main() {
+ int[4] a;
+ a[0] = 1;
+ rt.put_n(a[1]);
+ return 0;
+}
diff --git a/tests/errors/uninit_partial_struct.zc b/tests/errors/uninit_partial_struct.zc
new file mode 100644
index 0000000..7b65481
--- /dev/null
+++ b/tests/errors/uninit_partial_struct.zc
@@ -0,0 +1,12 @@
+namespace;
+include rt;
+
+struct point { int x; int y; }
+
+// expect: p: used before it is initialized
+fn main() {
+ point p;
+ p.x = 1;
+ rt.put_n(p.y);
+ return 0;
+}
diff --git a/tests/errors/uninit_read.zc b/tests/errors/uninit_read.zc
new file mode 100644
index 0000000..3a18a95
--- /dev/null
+++ b/tests/errors/uninit_read.zc
@@ -0,0 +1,9 @@
+namespace;
+include rt;
+
+// expect: x: used before it is initialized
+fn main() {
+ int x;
+ rt.put_n(x);
+ return 0;
+}