Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 5f5083ecd08695483327d194d9c4c0c2df735fb7)
+++ src/Tuples/TupleExpansion.cc	(revision d9fa60af0bc172d6842f414cb608e0615d3582a5)
@@ -93,5 +93,5 @@
 			typedef Mutator Parent;
 			using Parent::mutate;
-			
+
 			virtual Expression * mutate( TupleExpr * tupleExpr ) override;
 		};
@@ -218,19 +218,26 @@
 	Type * TupleTypeReplacer::mutate( TupleType * tupleType ) {
 		std::string mangleName = SymTab::Mangler::mangleType( tupleType );
-		TupleType * newType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) );
+		tupleType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) );
 		if ( ! typeMap.count( mangleName ) ) {
 			// generate struct type to replace tuple type
 			StructDecl * decl = new StructDecl( "_tuple_type_" + mangleName );
 			decl->set_body( true );
-			int cnt = 0;
-			for ( Type * t : *newType ) {
-				decl->get_members().push_back( new ObjectDecl( toString("field_", cnt++), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, t->clone(), nullptr ) );
+			for ( size_t i = 0; i < tupleType->size(); ++i ) {
+				TypeDecl * tyParam = new TypeDecl( toString("tuple_param_", i), DeclarationNode::NoStorageClass, nullptr, TypeDecl::Any );
+				decl->get_members().push_back( new ObjectDecl( toString("field_", i), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, new TypeInstType( Type::Qualifiers(), tyParam->get_name(), tyParam ), nullptr ) );
+				decl->get_parameters().push_back( tyParam );
 			}
 			typeMap[mangleName] = decl;
 			addDeclaration( decl );
 		}
-		Type::Qualifiers qualifiers = newType->get_qualifiers();
-		delete newType;
-		return new StructInstType( qualifiers, typeMap[mangleName] );
+		Type::Qualifiers qualifiers = tupleType->get_qualifiers();
+
+		StructDecl * decl = typeMap[mangleName];
+		StructInstType * newType = new StructInstType( qualifiers, decl );
+		for ( Type * t : *tupleType ) {
+			newType->get_parameters().push_back( new TypeExpr( t->clone() ) );
+		}
+		delete tupleType;
+		return newType;
 	}
 
