aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/o3fat.zc
blob: 487f2793ea82c0129f4345e2ff7d8bb034e6a60b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace;
include rt, run;

// o3 objects reaching normal code get their types: through a return (all the way down the list), an assignment, a store into a field
struct node { int v; node* next; };
struct box { node*[3] slots; int n; };
unchecked o3 node* build(int n) {
	node* head = 0;
	for (int i = 0; i < n; i++) { node* k = rt.new(node); k.v = i; k.next = head; head = k; }
	return head;
}
unchecked fn main() {
	node* l = build(5);
	run.tprint(rt.typeof_obj(l)); rt.put_c(' '); run.tprint(rt.typeof_obj(l.next.next.next)); rt.put_c(' ');
	rt.put_n(l.next.v); rt.put_c(' ');
	box* b = 0;
	o3 { b = rt.new(box); b.slots[1] = rt.new(node); b.n = 2; }
	run.tprint(rt.typeof_obj(b)); rt.put_c(' '); run.tprint(rt.typeof_obj(b.slots[1])); rt.put_c(' ');
	int* raw = 0;
	o3 { raw = rt.new(int, 6); }
	run.tprint(rt.typeof_obj(raw)); rt.put_c(10);
	return 0;
}