Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision fb4dc2836f4baf232dfe867576343c1133659525)
+++ src/SymTab/Indexer.cc	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
@@ -606,4 +606,24 @@
 	}
 
+	void Indexer::addAdt( const AdtDecl * decl ) {
+		++*stats().add_calls;
+		const std::string & id = decl->name;
+
+		if ( ! adtTable ) {
+			adtTable = AdtTable::new_ptr();
+		} else {
+			++* stats().map_lookups;
+			auto existing = adtTable->find( id );
+			if ( existing != adtTable->end()
+				&& existing->second.scope == scope
+				&& addedDeclConflicts( existing->second.decl, decl ) ) return;
+
+		}
+
+		lazyInitScope();
+		++* stats().map_mutations;
+		adtTable = adtTable->set( id, Scoped<AdtDecl>{ decl, scope} );
+	}
+
 	void Indexer::addUnion( const std::string & id ) {
 		addUnion( new UnionDecl( id ) );
Index: src/SymTab/Indexer.h
===================================================================
--- src/SymTab/Indexer.h	(revision fb4dc2836f4baf232dfe867576343c1133659525)
+++ src/SymTab/Indexer.h	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
@@ -89,4 +89,5 @@
 		void addStruct( const StructDecl * decl );
 		void addEnum( const EnumDecl * decl );
+		void addAdt( const AdtDecl * decl );
 		void addUnion( const std::string & id );
 		void addUnion( const UnionDecl * decl );
@@ -124,4 +125,5 @@
 		using UnionTable = PersistentMap< std::string, Scoped<UnionDecl> >;
 		using TraitTable = PersistentMap< std::string, Scoped<TraitDecl> >;
+		using AdtTable = PersistentMap< std::string, Scoped<AdtDecl> >;
 
 		IdTable::Ptr idTable;          ///< identifier namespace
@@ -131,4 +133,5 @@
 		UnionTable::Ptr unionTable;    ///< union namespace
 		TraitTable::Ptr traitTable;    ///< trait namespace
+		AdtTable::Ptr adtTable;		   ///< adt namespace
 
 		Ptr prevScope;                 ///< reference to indexer for parent scope
