Index: tests/.expect/functions.x64.txt
===================================================================
--- tests/.expect/functions.x64.txt	(revision 20f5eb8fcd1dbe0855f09f5501bde1b4136fe6f3)
+++ tests/.expect/functions.x64.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -121,4 +121,5 @@
 
 }
+struct _conc__tuple2_0;
 struct _conc__tuple2_0 {
     signed int field_0;
@@ -157,4 +158,5 @@
 
 }
+struct _conc__tuple3_1;
 struct _conc__tuple3_1 {
     signed int field_0;
@@ -170,4 +172,5 @@
     __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
 }
+struct _conc__tuple3_2;
 struct _conc__tuple3_2 {
     signed int field_0;
@@ -260,4 +263,5 @@
     __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
 }
+struct _conc__tuple2_3;
 struct _conc__tuple2_3 {
     signed int *field_0;
Index: tests/.expect/functions.x86.txt
===================================================================
--- tests/.expect/functions.x86.txt	(revision 20f5eb8fcd1dbe0855f09f5501bde1b4136fe6f3)
+++ tests/.expect/functions.x86.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -121,4 +121,5 @@
 
 }
+struct _conc__tuple2_0;
 struct _conc__tuple2_0 {
     signed int field_0;
@@ -157,4 +158,5 @@
 
 }
+struct _conc__tuple3_1;
 struct _conc__tuple3_1 {
     signed int field_0;
@@ -170,4 +172,5 @@
     __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
 }
+struct _conc__tuple3_2;
 struct _conc__tuple3_2 {
     signed int field_0;
@@ -260,4 +263,5 @@
     __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
 }
+struct _conc__tuple2_3;
 struct _conc__tuple2_3 {
     signed int *field_0;
Index: tests/.expect/poly-cycle.txt
===================================================================
--- tests/.expect/poly-cycle.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
+++ tests/.expect/poly-cycle.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -0,0 +1,1 @@
+Success!
Index: tests/poly-cycle.cfa
===================================================================
--- tests/poly-cycle.cfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
+++ tests/poly-cycle.cfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -0,0 +1,28 @@
+// Check that a cycle of polymorphic data structures can be instancated.
+
+#include <stdio.h>
+
+forall(otype T)
+struct func_table;
+
+forall(otype U)
+struct object {
+	func_table(U) * virtual_table;
+};
+
+forall(otype T)
+struct func_table {
+	void (*object_func)(object(T) *);
+};
+
+void func(object(int) *) {
+	printf("Success!\n");
+}
+
+func_table(int) an_instance = { func };
+
+int main(int argc, char * argv[]) {
+	object(int) x = { 0p };
+	an_instance.object_func( &x );
+	return 0;
+}
