Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 9feb34b1fca12748b7d48737024da48e342f5c07)
+++ src/SynTree/AggregateDecl.cc	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
@@ -29,5 +29,5 @@
 
 // These must harmonize with the corresponding AggregateDecl::Aggregate enumerations.
-static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName" };
+static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName", "data" };
 
 const char * AggregateDecl::aggrString( AggregateDecl::Aggregate aggr ) {
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 9feb34b1fca12748b7d48737024da48e342f5c07)
+++ src/SynTree/Declaration.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
@@ -268,5 +268,5 @@
 	typedef Declaration Parent;
   public:
-	enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };
+	enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate, ADT };
 	static const char * aggrString( Aggregate aggr );
 
@@ -341,4 +341,9 @@
 	Type * base;
 	enum EnumHiding { Visible, Hide } hide;
+
+	std::list<StructDecl*> data_constructors;
+	UnionDecl * data_union;
+	EnumDecl * tags;
+	StructDecl * tag_union;
 
 	EnumDecl( const std::string & name,
