Index: src/SymTab/Demangle.cc
===================================================================
--- src/SymTab/Demangle.cc	(revision 2f9768ff3e5bff4eeeafc8b20dbb07448db3e706)
+++ src/SymTab/Demangle.cc	(revision 38587bc15ccc31dd244fe746adf78d711211344a)
@@ -352,4 +352,6 @@
 				Type * parseArray(Type::Qualifiers tq);
 				Type * parseStruct(Type::Qualifiers tq);
+				Type * parseUnion(Type::Qualifiers tq);
+				Type * parseEnum(Type::Qualifiers tq);
 
 				Type * parseType();
@@ -372,4 +374,8 @@
 				parsers.emplace_back(Encoding::tuple, [this](Type::Qualifiers tq) { return parseTuple(tq); });
 				parsers.emplace_back(Encoding::struct_t, [this](Type::Qualifiers tq) { return parseStruct(tq); });
+				parsers.emplace_back(Encoding::union_t, [this](Type::Qualifiers tq) { return parseUnion(tq); });
+				parsers.emplace_back(Encoding::enum_t, [this](Type::Qualifiers tq) { return parseEnum(tq); });
+				parsers.emplace_back(Encoding::zero, [this](Type::Qualifiers tq) { return new ZeroType(tq); });
+				parsers.emplace_back(Encoding::one, [this](Type::Qualifiers tq) { return new OneType(tq); });
 			}
 
@@ -493,4 +499,18 @@
 			}
 
+			Type * StringView::parseUnion(Type::Qualifiers tq) {
+				PRINT( std::cerr << "union..." << std::endl; )
+				std::string name;
+				if (! extractName(name)) return nullptr;
+				return new UnionInstType(tq, name);
+			}
+
+			Type * StringView::parseEnum(Type::Qualifiers tq) {
+				PRINT( std::cerr << "enum..." << std::endl; )
+				std::string name;
+				if (! extractName(name)) return nullptr;
+				return new EnumInstType(tq, name);
+			}
+
 			Type * StringView::parseType() {
 				if (done()) return nullptr;
