Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision b6b3c42f415adcec079dd0d227f2ce609a0f0198)
+++ src/Parser/DeclarationNode.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -1031,8 +1031,9 @@
 
 	if ( variable.tyClass != NoTypeClass ) {
-		static const TypeDecl::Kind kindMap[] = { TypeDecl::Any, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
-		assertf( sizeof(kindMap)/sizeof(kindMap[0] == NoTypeClass-1), "DeclarationNode::build: kindMap is out of sync." );
+		// otype is internally converted to dtype + otype parameters
+		static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
+		assertf( sizeof(kindMap)/sizeof(kindMap[0]) == NoTypeClass, "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 ], variable.initializer ? variable.initializer->buildType() : nullptr );
+		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
 		buildList( variable.assertions, ret->get_assertions() );
 		return ret;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision b6b3c42f415adcec079dd0d227f2ce609a0f0198)
+++ src/Parser/TypeData.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -406,7 +406,8 @@
 void buildForall( const DeclarationNode * firstNode, ForallList &outputList ) {
 	buildList( firstNode, outputList );
-	for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i ) {
+	auto n = firstNode;
+	for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i, n = (DeclarationNode*)n->get_next() ) {
 		TypeDecl * td = static_cast<TypeDecl *>(*i);
-		if ( td->get_kind() == TypeDecl::Any ) {
+		if ( n->variable.tyClass == DeclarationNode::Otype ) {
 			// add assertion parameters to `type' tyvars in reverse order
 			// add dtor:  void ^?{}(T *)
@@ -798,5 +799,5 @@
 		ret = new TypedefDecl( name, scs, typebuild( td->base ), linkage );
 	} else {
-		ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Any );
+		ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Dtype, true );
 	} // if
 	buildList( td->symbolic.params, ret->get_parameters() );
