namespace;
include rt;
// passes the typechecker: words mix with everything, literal 0 is null,
// arrays decay to pointers, generic calls bind their parameters
typecheck on;
struct pair { A a; B b; };
pair*.u mk(A x, B y) { pair* p = rt.new(pair); p.a = x; p.b = y; return u*p; }
A left(pair* p) { return p.a; }
int strlen2(char* s) { int n = 0; while (s[n]) n++; return n; }
int main() {
pair* p = mk(3, "four");
int a = left(p);
char* s = p.b;
char[8] buf;
char* q = buf;
int* nothing = 0;
let w = 5;
int mixed = w + 1;
q[0] = 'h'; q[1] = 0;
rt.put_n(a + strlen2(s) + strlen2(buf) + mixed); rt.put_c(10);
rt.free(d*p);
return 0;
}