Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision d5baf0c8a1545b197cd3b7f1a29690cd5fbc548e)
+++ src/GenPoly/InstantiateGeneric.cc	(revision 8ec4a522d40e378e049e76cfcf19c4dc7de8a4a4)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu Aug 04 18:33:00 2016
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu Aug 04 18:33:00 2016
-// Update Count     : 1
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Jul 16 10:17:00 2020
+// Update Count     : 2
 //
 #include "InstantiateGeneric.h"
@@ -297,4 +297,16 @@
 	}
 
+	template< typename AggrInst >
+	static AggrInst * asForward( AggrInst * decl ) {
+		if ( !decl->body ) {
+			return nullptr;
+		}
+		decl = decl->clone();
+		decl->body = false;
+		deleteAll( decl->members );
+		decl->members.clear();
+		return decl;
+	}
+
 	void GenericInstantiator::stripDtypeParams( AggregateDecl *base, std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs ) {
 		substituteMembers( base->get_members(), baseParams, typeSubs );
@@ -373,5 +385,9 @@
 				concDecl->set_body( inst->get_baseStruct()->has_body() );
 				substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				insert( inst, typeSubs, concDecl ); // must insert before recursion
+				// Forward declare before recursion. (TODO: Only when needed, #199.)
+				insert( inst, typeSubs, concDecl );
+				if ( StructDecl *forwardDecl = asForward( concDecl ) ) {
+					declsToAddBefore.push_back( forwardDecl );
+				}
 				concDecl->acceptMutator( *visitor ); // recursively instantiate members
 				declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first
@@ -423,5 +439,9 @@
 				concDecl->set_body( inst->get_baseUnion()->has_body() );
 				substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				insert( inst, typeSubs, concDecl ); // must insert before recursion
+				// Forward declare before recursion. (TODO: Only when needed, #199.)
+				insert( inst, typeSubs, concDecl );
+				if ( UnionDecl *forwardDecl = asForward( concDecl ) ) {
+					declsToAddBefore.push_back( forwardDecl );
+				}
 				concDecl->acceptMutator( *visitor ); // recursively instantiate members
 				declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first
