Index: tests/exceptions/.expect/polymophic.txt
===================================================================
--- tests/exceptions/.expect/polymophic.txt	(revision 53ee27e46dd5864a8ace801fe844ed654a140169)
+++ tests/exceptions/.expect/polymophic.txt	(revision 53ee27e46dd5864a8ace801fe844ed654a140169)
@@ -0,0 +1,7 @@
+terminate catch
+resume catch
+caught proxy(char)
+
+-7
+0
+1
Index: tests/exceptions/polymophic.cfa
===================================================================
--- tests/exceptions/polymophic.cfa	(revision 53ee27e46dd5864a8ace801fe844ed654a140169)
+++ tests/exceptions/polymophic.cfa	(revision 53ee27e46dd5864a8ace801fe844ed654a140169)
@@ -0,0 +1,72 @@
+// Testing polymophic exception types.
+
+#include <exception.hfa>
+
+FORALL_TRIVIAL_EXCEPTION_(proxy, (otype U3), (U3));
+FORALL_TRIVIAL_INSTANCE_(proxy, (otype U4), (U4))
+
+const char * msg(proxy(int) * this) { return "proxy(int)"; }
+const char * msg(proxy(char) * this) { return "proxy(char)"; }
+POLY_VTABLE_INSTANCE(proxy, int)(msg);
+POLY_VTABLE_INSTANCE(proxy, char)(msg);
+
+void proxy_test () {
+    try {
+		throw (proxy(int)){};
+	} catch (proxy(int) *) {
+		printf("terminate catch\n");
+	}
+
+	try {
+		throwResume (proxy(char)){};
+	} catchResume (proxy(char) *) {
+		printf("resume catch\n");
+	}
+
+	try {
+		throw (proxy(char)){};
+	} catch (proxy(int) *) {
+		printf("caught proxy(int)\n");
+	} catch (proxy(char) *) {
+		printf("caught proxy(char)\n");
+	}
+}
+
+FORALL_DATA_EXCEPTION(cell, (otype T), (T))(
+	T data;
+);
+
+FORALL_DATA_INSTANCE(cell, (otype T), (T))
+
+const char * msg(cell(int) * this) { return "cell(int)"; }
+const char * msg(cell(char) * this) { return "cell(char)"; }
+const char * msg(cell(bool) * this) { return "cell(bool)"; }
+POLY_VTABLE_INSTANCE(cell, int)(msg);
+POLY_VTABLE_INSTANCE(cell, char)(msg);
+POLY_VTABLE_INSTANCE(cell, bool)(msg);
+
+void cell_test(void) {
+	try {
+		cell(int) except;
+		except.data = -7;
+		throw except;
+	} catch (cell(int) * error) {
+		printf("%d\n", error->data);
+	}
+
+	try {
+		cell(bool) ball;
+		ball.data = false;
+		throwResume ball;
+		printf("%i\n", ball.data);
+	} catchResume (cell(bool) * error) {
+		printf("%i\n", error->data);
+		error->data = true;
+	}
+}
+
+int main(int argc, char * argv[]) {
+	proxy_test();
+	printf("\n");
+	cell_test();
+}
