Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 02153febd80045a0fdce301fb0f003053d5fa36c)
+++ src/GenPoly/InstantiateGeneric.cc	(revision c7a30813626cbca3ee08af1e72db028b89e73881)
@@ -367,7 +367,7 @@
 				concDecl->set_body( inst->get_baseStruct()->has_body() );
 				substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				DeclMutator::addDeclaration( concDecl );
-				insert( inst, typeSubs, concDecl );
+				insert( inst, typeSubs, concDecl ); // must insert before recursion
 				concDecl->acceptMutator( *this ); // recursively instantiate members
+				DeclMutator::addDeclaration( concDecl ); // must occur before declaration is added so that member instantiations appear first
 			}
 			StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
@@ -422,7 +422,7 @@
 				concDecl->set_body( inst->get_baseUnion()->has_body() );
 				substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				DeclMutator::addDeclaration( concDecl );
-				insert( inst, typeSubs, concDecl );
+				insert( inst, typeSubs, concDecl ); // must insert before recursion
 				concDecl->acceptMutator( *this ); // recursively instantiate members
+				DeclMutator::addDeclaration( concDecl ); // must occur before declaration is added so that member instantiations appear first
 			}
 			UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
Index: src/SynTree/TypeSubstitution.cc
===================================================================
--- src/SynTree/TypeSubstitution.cc	(revision 02153febd80045a0fdce301fb0f003053d5fa36c)
+++ src/SynTree/TypeSubstitution.cc	(revision c7a30813626cbca3ee08af1e72db028b89e73881)
@@ -166,11 +166,11 @@
 			boundVars.insert( (*tyvar )->get_name() );
 		} // for
-	} // if
-	// bind type variables from generic type instantiations
-	std::list< TypeDecl* > *baseParameters = type->get_baseParameters();
-	if ( baseParameters && ! type->get_parameters().empty() ) {
-		for ( std::list< TypeDecl* >::const_iterator tyvar = baseParameters->begin(); tyvar != baseParameters->end(); ++tyvar ) {
-			boundVars.insert( (*tyvar)->get_name() );
-		} // for
+		// bind type variables from generic type instantiations
+		std::list< TypeDecl* > *baseParameters = type->get_baseParameters();
+		if ( baseParameters && ! type->get_parameters().empty() ) {
+			for ( std::list< TypeDecl* >::const_iterator tyvar = baseParameters->begin(); tyvar != baseParameters->end(); ++tyvar ) {
+				boundVars.insert( (*tyvar)->get_name() );
+			} // for
+		} // if
 	} // if
 	Type *ret = Mutator::mutate( type );
