Index: src/SymTab/Demangle.cc
===================================================================
--- src/SymTab/Demangle.cc	(revision 0e73845c79836fc811677075d13e2a1858071a38)
+++ src/SymTab/Demangle.cc	(revision 04c7779177abc8406a5ca4096b6a829b176215c3)
@@ -23,5 +23,5 @@
 #include "SynTree/Declaration.h"
 
-// #define DEBUG
+#define DEBUG
 #ifdef DEBUG
 #define PRINT(x) x
@@ -365,4 +365,13 @@
 						PRINT( std::cerr << "basic type: " << k << std::endl; )
 						return new BasicType(tq, (BasicType::Kind)k);
+					});
+				}
+				// type variable types
+				for (size_t k = 0; k < TypeDecl::NUMBER_OF_KINDS; ++k) {
+					parsers.emplace_back(Encoding::typeVariables[k], [k, this](Type::Qualifiers tq) -> TypeInstType * {
+						PRINT( std::cerr << "type variable type: " << k << std::endl; )
+						std::string name;
+						if (! extractName(name)) return nullptr;
+						return new TypeInstType(tq, name, (TypeDecl::Kind)k != TypeDecl::Ftype);
 					});
 				}
@@ -516,4 +525,24 @@
 				if (done()) return nullptr;
 
+				std::list<TypeDecl *> forall;
+				if (isPrefix(Encoding::forall)) {
+					PRINT( std::cerr << "polymorphic with..." << std::endl; )
+					size_t dcount, fcount, vcount, acount;
+					if (! extractNumber(dcount)) return nullptr;
+					PRINT( std::cerr << dcount << " dtypes" << std::endl; )
+					if (! expect('_')) return nullptr;
+					if (! extractNumber(fcount)) return nullptr;
+					PRINT( std::cerr << fcount << " ftypes" << std::endl; )
+					if (! expect('_')) return nullptr;
+					if (! extractNumber(vcount)) return nullptr;
+					PRINT( std::cerr << vcount << " ttypes" << std::endl; )
+					if (! expect('_')) return nullptr;
+					if (! extractNumber(acount)) return nullptr;
+					PRINT( std::cerr << acount << " assertions" << std::endl; )
+					if (! expect('_')) return nullptr;
+					// recursively(?) parse `acount` assertions
+					if (! expect('_')) return nullptr;
+				}
+
 				// qualifiers
 				Type::Qualifiers tq;
@@ -531,5 +560,8 @@
 				});
 				assertf(iter != parsers.end(), "Unhandled type letter: %c at index: %zd", cur(), idx);
-				return iter->second(tq);
+				Type * ret = iter->second(tq);
+				if (! ret) return nullptr;
+				ret->forall = std::move(forall);
+				return ret;
 			}
 
