1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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')
|