Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/AST/Convert.cpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -2717,5 +2717,5 @@
 
 		for (auto & param : foralls) {
-			ty->forall.emplace_back(new ast::TypeInstType(param->name, param));
+			ty->forall.emplace_back(new ast::TypeInstType(param));
 			for (auto asst : param->assertions) {
 				ty->assertions.emplace_back(new ast::VariableExpr({}, asst));
Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/AST/Decl.cpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -68,5 +68,5 @@
 	}
 	for (auto & tp : this->type_params) {
-		ftype->forall.emplace_back(new TypeInstType(tp->name, tp));
+		ftype->forall.emplace_back(new TypeInstType(tp));
 		for (auto & ap: tp->assertions) {
 			ftype->assertions.emplace_back(new VariableExpr(loc, ap));
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/AST/Type.cpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -147,4 +147,8 @@
 // --- TypeInstType
 
+TypeInstType::TypeInstType( const TypeDecl * b,
+	CV::Qualifiers q, std::vector<ptr<Attribute>> && as )
+: BaseInstType( b->name, q, move(as) ), base( b ), kind( b->kind ) {}
+
 void TypeInstType::set_base( const TypeDecl * b ) {
 	base = b;
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/AST/Type.hpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -421,4 +421,8 @@
 		std::vector<ptr<Attribute>> && as = {} )
 	: BaseInstType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
+
+	TypeInstType( const TypeDecl * b,
+		CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} );
+
 	TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
Index: src/Concurrency/KeywordsNew.cpp
===================================================================
--- src/Concurrency/KeywordsNew.cpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/Concurrency/KeywordsNew.cpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -88,6 +88,5 @@
 		auto typeDecl = ast::deepCopy( typeParam );
 		mutFunc->type_params.push_back( typeDecl );
-		mutType->forall.push_back(
-			new ast::TypeInstType( typeDecl->name, typeDecl ) );
+		mutType->forall.push_back( new ast::TypeInstType( typeDecl ) );
 		for ( auto & assertion : typeDecl->assertions ) {
 			mutFunc->assertions.push_back( assertion );
@@ -108,9 +107,7 @@
 	for ( const ast::ptr<ast::TypeDecl> & typeDecl : mutFunc->type_params ) {
 		paramTypeInst->params.push_back(
-			new ast::TypeExpr( location,
-				new ast::TypeInstType( typeDecl->name, typeDecl ) ) );
+			new ast::TypeExpr( location, new ast::TypeInstType( typeDecl ) ) );
 		typeParamInst->params.push_back(
-			new ast::TypeExpr( location,
-				new ast::TypeInstType( typeDecl->name, typeDecl ) ) );
+			new ast::TypeExpr( location, new ast::TypeInstType( typeDecl ) ) );
 	}
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/ResolvExpr/Resolver.cc	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -1385,5 +1385,5 @@
 			for (auto & typeParam : mutDecl->type_params) {
 				symtab.addType(typeParam);
-				mutType->forall.emplace_back(new ast::TypeInstType(typeParam->name, typeParam));
+				mutType->forall.emplace_back(new ast::TypeInstType(typeParam));
 			}
 			for (auto & asst : mutDecl->assertions) {
Index: src/Validate/Autogen.cpp
===================================================================
--- src/Validate/Autogen.cpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/Validate/Autogen.cpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -248,5 +248,5 @@
 		structInst.params.push_back( new ast::TypeExpr(
 			typeDecl->location,
-			new ast::TypeInstType( typeDecl->name, typeDecl )
+			new ast::TypeInstType( typeDecl )
 		) );
 	}
@@ -264,5 +264,5 @@
 		unionInst.params.push_back( new ast::TypeExpr(
 			unionDecl->location,
-			new ast::TypeInstType( typeDecl->name, typeDecl )
+			new ast::TypeInstType( typeDecl )
 		) );
 	}
Index: src/Validate/ForallPointerDecay.cpp
===================================================================
--- src/Validate/ForallPointerDecay.cpp	(revision dfd341073382ae3db173515cb6f101c3fff8cbdd)
+++ src/Validate/ForallPointerDecay.cpp	(revision b230091f39bb4aefe0def3377d63fcd444340a3f)
@@ -41,5 +41,5 @@
 	for ( auto & type_param : decl->type_params ) {
 		type->forall.emplace_back(
-			new ast::TypeInstType( type_param->name, type_param ) );
+			new ast::TypeInstType( type_param ) );
 	}
 	for ( auto & assertion : decl->assertions ) {
