#!/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')