Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 84d58c5ecfcdf2942bf75618eb315dcfca19daee)
+++ src/Parser/DeclarationNode.cc	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -57,4 +57,5 @@
 	variable.tyClass = NoTypeClass;
 	variable.assertions = nullptr;
+	variable.initializer = nullptr;
 
 //	attr.name = nullptr;
@@ -70,4 +71,5 @@
 //	delete variable.name;
 	delete variable.assertions;
+	delete variable.initializer;
 
 	delete type;
@@ -101,4 +103,5 @@
 	newnode->variable.tyClass = variable.tyClass;
 	newnode->variable.assertions = maybeClone( variable.assertions );
+	newnode->variable.initializer = maybeClone( variable.initializer );
 
 //	newnode->attr.name = attr.name ? new string( *attr.name ) : nullptr;
@@ -857,4 +860,10 @@
 }
 
+DeclarationNode * DeclarationNode::addTypeInitializer( DeclarationNode * init ) {
+	assertf( variable.tyClass != NoTypeClass, "Called addTypeInitializer on something that isn't a type variable." );
+	variable.initializer = init;
+	return this;
+}
+
 DeclarationNode * DeclarationNode::cloneType( string * newName ) {
 	DeclarationNode * newnode = new DeclarationNode;
@@ -1014,5 +1023,5 @@
 		assertf( sizeof(kindMap)/sizeof(kindMap[0] == NoTypeClass-1), "DeclarationNode::build: kindMap is out of sync." );
 		assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." );
-		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ] );
+		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.initializer ? variable.initializer->buildType() : nullptr );
 		buildList( variable.assertions, ret->get_assertions() );
 		return ret;
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 84d58c5ecfcdf2942bf75618eb315dcfca19daee)
+++ src/Parser/ParseNode.h	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -274,4 +274,5 @@
 	DeclarationNode * addIdList( DeclarationNode * list ); // old-style functions
 	DeclarationNode * addInitializer( InitializerNode * init );
+	DeclarationNode * addTypeInitializer( DeclarationNode * init );
 
 	DeclarationNode * cloneType( std::string * newName );
@@ -301,4 +302,5 @@
 		DeclarationNode::TypeClass tyClass;
 		DeclarationNode * assertions;
+		DeclarationNode * initializer;
 	};
 	Variable_t variable;
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 84d58c5ecfcdf2942bf75618eb315dcfca19daee)
+++ src/Parser/parser.yy	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -1606,5 +1606,7 @@
 
 typegen_name:											// CFA
-	TYPEGENname '(' type_list ')'
+	TYPEGENname '(' ')'
+		{ $$ = DeclarationNode::newFromTypeGen( $1, nullptr ); }
+	| TYPEGENname '(' type_list ')'
 		{ $$ = DeclarationNode::newFromTypeGen( $1, $3 ); }
 	;
@@ -1983,6 +1985,7 @@
 
 type_parameter_list:									// CFA
-	type_parameter type_initializer_opt
-	| type_parameter_list ',' type_parameter type_initializer_opt
+	type_parameter
+		{ $$ = $1; }
+	| type_parameter_list ',' type_parameter
 		{ $$ = $1->appendList( $3 ); }
 	;
@@ -1998,6 +2001,6 @@
 	type_class no_attr_identifier_or_type_name
 		{ typedefTable.addToEnclosingScope( *$2, TypedefTable::TD ); }
-	  assertion_list_opt
-		{ $$ = DeclarationNode::newTypeParam( $1, $2 )->addAssertions( $4 ); }
+	  type_initializer_opt assertion_list_opt
+		{ $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); }
 	| type_specifier identifier_parameter_declarator
 	;
