Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 4139e3d97cd8420f817d0f2153368bdb2fa372f5)
+++ src/Tuples/TupleExpansion.cc	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
@@ -320,26 +320,23 @@
 	}
 	const ast::Type * makeTupleType( const std::vector<ast::ptr<ast::Expr>> & exprs ) {
-		(void) exprs;
-		#warning Not implemented; needs Type.cpp in build
-		assertf(false, "Not implemented; needs Type.cpp in build");
-		// // produce the TupleType which aggregates the types of the exprs
-		// std::vector<ast::ptr<ast::Type>> types;
-		// ast::CV::Qualifiers quals{
-		// 	ast::CV::Const | ast::CV::Volatile | ast::CV::Restrict | ast::CV::Lvalue |
-		// 	ast::CV::Atomic | ast::CV::Mutex };
-
-		// for ( const ast::Expr * expr : exprs ) {
-		// 	assert( expr->result );
-		// 	// if the type of any expr is void, the type of the entire tuple is void
-		// 	if ( expr->result->isVoid() ) return new ast::VoidType{};
-
-		// 	// qualifiers on the tuple type are the qualifiers that exist on all components
-		// 	quals &= expr->result->qualifiers;
-
-		// 	types.emplace_back( expr->result );
-		// }
-
-		// if ( exprs.empty() ) { quals = ast::CV::Qualifiers{}; }
-		// return new ast::TupleType{ std::move(types), quals };
+		// produce the TupleType which aggregates the types of the exprs
+		std::vector<ast::ptr<ast::Type>> types;
+		ast::CV::Qualifiers quals{
+			ast::CV::Const | ast::CV::Volatile | ast::CV::Restrict | ast::CV::Lvalue |
+			ast::CV::Atomic | ast::CV::Mutex };
+
+		for ( const ast::Expr * expr : exprs ) {
+			assert( expr->result );
+			// if the type of any expr is void, the type of the entire tuple is void
+			if ( expr->result->isVoid() ) return new ast::VoidType{};
+
+			// qualifiers on the tuple type are the qualifiers that exist on all components
+			quals &= expr->result->qualifiers;
+
+			types.emplace_back( expr->result );
+		}
+
+		if ( exprs.empty() ) { quals = ast::CV::Qualifiers{}; }
+		return new ast::TupleType{ std::move(types), quals };
 	}
 
@@ -354,5 +351,9 @@
 
 	const ast::TypeInstType * isTtype( const ast::Type * type ) {
-		#warning unimplemented
+		if ( const ast::TypeInstType * inst = dynamic_cast< const ast::TypeInstType * >( type ) ) {
+			if ( inst->base && inst->base->kind == ast::TypeVar::Ttype ) {
+				return inst;
+			}
+		}
 		return nullptr;
 	}
