aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/local_index_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/drivers/local_index_test.py')
-rw-r--r--tests/drivers/local_index_test.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/tests/drivers/local_index_test.py b/tests/drivers/local_index_test.py
new file mode 100644
index 0000000..95bfd78
--- /dev/null
+++ b/tests/drivers/local_index_test.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+# local name heads survive shadowing, scope reuse, closures, and context switches.
+import subprocess
+import sys
+source = '''
+fn choose(int x) {
+ let total = x;
+ { let x = 7; total += x; }
+ { let x = 9; total += x; }
+ let f = fn(int x) { return x + 1; };
+ let g = fn() { return total; };
+ return total + x + f(3) + g();
+}
+o3 int fast(int x) { int result = x; { int x = 8; result += x; } return result + x; }
+fn main() { put_n(choose(2)); put_c(32); put_n(fast(3)); put_c(10); return 0; }
+'''
+result = subprocess.run(sys.argv[1:], input=source, text=True, capture_output=True, timeout=15)
+assert result.returncode == 0 and result.stdout == '42 14\n', (result.returncode, result.stdout, result.stderr)
+print('ok local shadow chains, reused scopes, closure parameters, captures, and o3 contexts')
+source = 'struct point { int x, y; };\nfn main() { let a[3]; a[1] = 7; let alias = a; point p; p.x = 9; let ref = p; put_n(alias[1]); put_c(32); put_n(ref.x); put_c(10); return 0; }\n'
+result = subprocess.run(sys.argv[1:], input=source, text=True, capture_output=True, timeout=15)
+assert result.returncode == 0 and result.stdout == '7 9\n', (result.returncode, result.stdout, result.stderr)
+print('ok inferred aliases load array and struct addresses rather than the alias slot')