aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/tagenum.zc
blob: f438c5b9b7fb09bbdb021cb1968445eb52208611 (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
24
25
26
// tagged enums: a member can carry fields, a constructor builds it, and a
// switch matches on the member and binds its fields
enum shape { circle { int r; }, rect { int w; int h; }, dot };

fn area(shape* s) {
	switch (s) {
	case circle(r): return r * r * 3;
	case rect(w, h): return w * h;
	case dot: return 0;
	}
	return -1;
}

fn main() {
	shape* a = shape.circle(3);
	shape* b = shape.rect(4, 5);
	shape* c = shape.dot();
	put_n(area(a)); put_c(32);
	put_n(area(b)); put_c(32);
	put_n(area(c)); put_c(32);
	put_n(a.tag); put_c(32);
	put_n(b.tag); put_c(32);
	put_n(c.tag); put_c(10);
	free(d*a); free(d*b); free(d*c);
	return 0;
}