aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/tagenum.zc
diff options
context:
space:
mode:
Diffstat (limited to 'tests/programs/tagenum.zc')
-rw-r--r--tests/programs/tagenum.zc26
1 files changed, 26 insertions, 0 deletions
diff --git a/tests/programs/tagenum.zc b/tests/programs/tagenum.zc
new file mode 100644
index 0000000..f438c5b
--- /dev/null
+++ b/tests/programs/tagenum.zc
@@ -0,0 +1,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;
+}