Index: src/CodeGen/OperatorTable.cc
===================================================================
--- src/CodeGen/OperatorTable.cc	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/CodeGen/OperatorTable.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 13 14:33:05 2016
-// Update Count     : 10
+// Last Modified On : Sat Jul 15 17:12:22 2017
+// Update Count     : 15
 //
 
@@ -35,4 +35,5 @@
 			{	"++?",		"++",	"_operator_preincr",			OT_PREFIXASSIGN		},
 			{	"--?",		"--",	"_operator_predecr",			OT_PREFIXASSIGN		},
+			{	"?\\?",		"\\",	"_operator_exponential",		OT_INFIX			},
 			{	"?*?",		"*",	"_operator_multiply",			OT_INFIX			},
 			{	"?/?",		"/",	"_operator_divide",				OT_INFIX			},
@@ -52,4 +53,5 @@
 			{	"?|?",		"|",	"_operator_bitor",				OT_INFIX			},
 			{	"?=?",		"=",	"_operator_assign",				OT_INFIXASSIGN		},
+			{	"?\\=?",	"\\=",	"_operator_expassign",			OT_INFIXASSIGN		},
 			{	"?*=?",		"*=",	"_operator_multassign",			OT_INFIXASSIGN		},
 			{	"?/=?",		"/=",	"_operator_divassign",			OT_INFIXASSIGN		},
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Makefile.in	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -216,4 +216,5 @@
 	SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \
 	SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \
+	SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Type.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) \
@@ -514,6 +515,6 @@
 	SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \
 	SymTab/FixFunction.cc SymTab/ImplementationType.cc \
-	SymTab/TypeEquality.cc SymTab/Autogen.cc SynTree/Type.cc \
-	SynTree/VoidType.cc SynTree/BasicType.cc \
+	SymTab/TypeEquality.cc SymTab/Autogen.cc SymTab/TreeStruct.cc \
+	SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \
 	SynTree/PointerType.cc SynTree/ArrayType.cc \
 	SynTree/FunctionType.cc SynTree/ReferenceToType.cc \
@@ -848,4 +849,6 @@
 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
+SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT): SymTab/$(am__dirstamp) \
+	SymTab/$(DEPDIR)/$(am__dirstamp)
 SynTree/$(am__dirstamp):
 	@$(MKDIR_P) SynTree
@@ -1033,4 +1036,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Mangler.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Validate.Po@am__quote@
@@ -2084,4 +2088,18 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-Autogen.obj `if test -f 'SymTab/Autogen.cc'; then $(CYGPATH_W) 'SymTab/Autogen.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/Autogen.cc'; fi`
+
+SymTab/driver_cfa_cpp-TreeStruct.o: SymTab/TreeStruct.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
+
+SymTab/driver_cfa_cpp-TreeStruct.obj: SymTab/TreeStruct.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
 
 SynTree/driver_cfa_cpp-Type.o: SynTree/Type.cc
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/DeclarationNode.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 28 15:27:00 2017
-// Update Count     : 1019
+// Last Modified On : Fri Jul 14 16:55:00 2017
+// Update Count     : 1020
 //
 
@@ -253,4 +253,6 @@
 	newnode->type->aggregate.fields = fields;
 	newnode->type->aggregate.body = body;
+	newnode->type->aggregate.tagged = false;
+	newnode->type->aggregate.parent = nullptr;
 	return newnode;
 } // DeclarationNode::newAggregate
@@ -273,4 +275,18 @@
 	return newnode;
 } // DeclarationNode::newEnumConstant
+
+DeclarationNode * DeclarationNode::newTreeStruct( Aggregate kind, const string * name, const string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
+	assert( name );
+	DeclarationNode * newnode = new DeclarationNode;
+	newnode->type = new TypeData( TypeData::Aggregate );
+	newnode->type->aggregate.kind = kind;
+	newnode->type->aggregate.name = name;
+	newnode->type->aggregate.actuals = actuals;
+	newnode->type->aggregate.fields = fields;
+	newnode->type->aggregate.body = body;
+	newnode->type->aggregate.tagged = true;
+	newnode->type->aggregate.parent = parent;
+	return newnode;
+} // DeclarationNode::newTreeStruct
 
 DeclarationNode * DeclarationNode::newName( string * name ) {
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/ExpressionNode.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 28 21:08:15 2017
-// Update Count     : 542
+// Last Modified On : Sat Jul 15 16:09:04 2017
+// Update Count     : 549
 //
 
@@ -231,9 +231,10 @@
 }
 
+// Must harmonize with OperKinds.
 static const char *OperName[] = {
 	// diadic
-	"SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
+	"SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&",
 	"?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
-	"?=?", "?@=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
+	"?=?", "?@=?", "?\\=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
 	"?[?]", "...",
 	// monadic
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/ParseNode.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:28:16 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Jun 12 13:00:00 2017
-// Update Count     : 779
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Jul 15 16:00:48 2017
+// Update Count     : 785
 //
 
@@ -141,9 +141,10 @@
 };
 
+// Must harmonize with OperName.
 enum class OperKinds {
 	// diadic
-	SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,
+	SizeOf, AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And,
 	BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
-	Assign, AtAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
+	Assign, AtAssn, ExpAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
 	Index, Range,
 	// monadic
@@ -248,4 +249,7 @@
 	static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
 
+	// Perhaps this would best fold into newAggragate.
+	static DeclarationNode * newTreeStruct( Aggregate kind, const std::string * name, const std::string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body );
+
 	DeclarationNode();
 	~DeclarationNode();
@@ -332,4 +336,7 @@
 
 	static UniqueName anonymous;
+
+	// Temp to test TreeStruct
+	const std::string * parent_name;
 }; // DeclarationNode
 
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/TypeData.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 28 15:28:00 2017
-// Update Count     : 564
+// Last Modified On : Fri Jul 14 16:58:00 2017
+// Update Count     : 565
 //
 
@@ -63,4 +63,6 @@
 		aggregate.fields = nullptr;
 		aggregate.body = false;
+		aggregate.tagged = false;
+		aggregate.parent = nullptr;
 		break;
 	  case AggregateInst:
@@ -121,4 +123,5 @@
 		delete aggregate.actuals;
 		delete aggregate.fields;
+		delete aggregate.parent;
 		// delete aggregate;
 		break;
@@ -192,4 +195,6 @@
 		newtype->aggregate.kind = aggregate.kind;
 		newtype->aggregate.body = aggregate.body;
+		newtype->aggregate.tagged = aggregate.tagged;
+		newtype->aggregate.parent = aggregate.parent ? new string( *aggregate.parent ) : nullptr;
 		break;
 	  case AggregateInst:
@@ -619,4 +624,9 @@
 	switch ( td->aggregate.kind ) {
 	  case DeclarationNode::Struct:
+		if ( td->aggregate.tagged ) {
+			at = new StructDecl( *td->aggregate.name, td->aggregate.parent, attributes, linkage );
+			buildForall( td->aggregate.params, at->get_parameters() );
+			break;
+		}
 	  case DeclarationNode::Coroutine:
 	  case DeclarationNode::Monitor:
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/TypeData.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 28 15:29:00 2017
-// Update Count     : 186
+// Last Modified On : Fri Jul 14 16:57:00 2017
+// Update Count     : 187
 //
 
@@ -31,4 +31,7 @@
 		DeclarationNode * fields;
 		bool body;
+
+		bool tagged;
+		const std::string * parent;
 	};
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/lex.ll	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Wed Jul 12 18:04:44 2017
- * Update Count     : 535
+ * Last Modified On : Sat Jul 15 15:46:34 2017
+ * Update Count     : 542
  */
 
@@ -125,5 +125,5 @@
 op_unary {op_unary_only}|{op_unary_binary}|{op_unary_pre_post}
 
-op_binary_only "/"|"%"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&="|"|="|"^="|"<<="|">>="
+op_binary_only "/"|"%"|"\\"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"\\="|"&="|"|="|"^="|"<<="|">>="
 op_binary_over {op_unary_binary}|{op_binary_only}
 				// op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
@@ -136,5 +136,5 @@
 
 %%
-				   /* line directives */
+				/* line directives */
 ^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["].*"\n" {
 	/* " stop highlighting */
@@ -337,4 +337,5 @@
 "-"				{ ASCIIOP_RETURN(); }
 "*"				{ ASCIIOP_RETURN(); }
+"\\"			{ ASCIIOP_RETURN(); }					// CFA, exponentiation
 "/"				{ ASCIIOP_RETURN(); }
 "%"				{ ASCIIOP_RETURN(); }
@@ -361,4 +362,5 @@
 "+="			{ NAMEDOP_RETURN(PLUSassign); }
 "-="			{ NAMEDOP_RETURN(MINUSassign); }
+"\\="			{ NAMEDOP_RETURN(EXPassign); }			// CFA, exponentiation
 "*="			{ NAMEDOP_RETURN(MULTassign); }
 "/="			{ NAMEDOP_RETURN(DIVassign); }
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/Parser/parser.yy	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -9,7 +9,7 @@
 // Author           : Peter A. Buhr
 // Created On       : Sat Sep  1 20:22:55 2001
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 13 14:38:54 2017
-// Update Count     : 2431
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jul 17 12:17:00 2017
+// Update Count     : 2455
 //
 
@@ -151,5 +151,5 @@
 %token ELLIPSIS											// ...
 
-%token MULTassign	DIVassign	MODassign				// *=	/=	%=/
+%token EXPassign	MULTassign	DIVassign	MODassign	// \=	*=	/=	%=
 %token PLUSassign	MINUSassign							// +=	-=
 %token LSassign		RSassign							// <<=	>>=
@@ -168,10 +168,11 @@
 %type<op> ptrref_operator				unary_operator				assignment_operator
 %type<en> primary_expression			postfix_expression			unary_expression
-%type<en> cast_expression				multiplicative_expression	additive_expression			shift_expression
-%type<en> relational_expression			equality_expression			AND_expression				exclusive_OR_expression
-%type<en> inclusive_OR_expression		logical_AND_expression		logical_OR_expression		conditional_expression
-%type<en> constant_expression			assignment_expression		assignment_expression_opt
+%type<en> cast_expression				exponential_expression		multiplicative_expression	additive_expression
+%type<en> shift_expression				relational_expression		equality_expression
+%type<en> AND_expression				exclusive_OR_expression		inclusive_OR_expression
+%type<en> logical_AND_expression		logical_OR_expression
+%type<en> conditional_expression		constant_expression			assignment_expression		assignment_expression_opt
 %type<en> comma_expression				comma_expression_opt
-%type<en> argument_expression_list		argument_expression			assignment_opt
+%type<en> argument_expression_list		argument_expression			default_initialize_opt
 %type<fctl> for_control_expression
 %type<en> subrange
@@ -573,11 +574,17 @@
 	;
 
+exponential_expression:
+	cast_expression
+	| exponential_expression '\\' cast_expression
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); }
+	;
+
 multiplicative_expression:
-	cast_expression
-	| multiplicative_expression '*' cast_expression
+	exponential_expression
+	| multiplicative_expression '*' exponential_expression
 		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
-	| multiplicative_expression '/' cast_expression
+	| multiplicative_expression '/' exponential_expression
 		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
-	| multiplicative_expression '%' cast_expression
+	| multiplicative_expression '%' exponential_expression
 		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
 	;
@@ -678,4 +685,5 @@
 	'='											{ $$ = OperKinds::Assign; }
 	| ATassign									{ $$ = OperKinds::AtAssn; }
+	| EXPassign									{ $$ = OperKinds::ExpAssn; }
 	| MULTassign								{ $$ = OperKinds::MulAssn; }
 	| DIVassign									{ $$ = OperKinds::DivAssn; }
@@ -972,8 +980,13 @@
 		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
 
-	| handler_key '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = new StatementNode( build_catch( $1, $5, nullptr, $8 ) ); }
-	| handler_clause handler_key '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $9 ) ) ); }
+	| handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
+		{ $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); }
+	| handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); }
+	;
+
+handler_predicate_opt:
+	//empty
+	| ';' conditional_expression
 	;
 
@@ -1667,4 +1680,28 @@
 	| aggregate_key attribute_list_opt typegen_name		// CFA
 		{ $$ = $3->addQualifiers( $2 ); }
+
+// Temp, testing TreeStruct
+    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name
+        {
+            typedefTable.makeTypedef( *$4 );            // create typedef
+            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
+            forall = false;                             // reset
+        }
+      '{' field_declaration_list '}'
+        {
+            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
+                $4, nullptr, nullptr, $7, true )->addQualifiers( $3 );
+        }
+    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname
+        {
+            typedefTable.makeTypedef( *$4 );            // create typedef
+            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
+            forall = false;                             // reset
+        }
+      '{' field_declaration_list '}'
+        {
+            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
+                $4, $5, nullptr, $8, true )->addQualifiers( $3 );
+        }
 	;
 
@@ -1845,10 +1882,10 @@
 cfa_parameter_declaration:								// CFA, new & old style parameter declaration
 	parameter_declaration
-	| cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt
+	| cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt
 		{ $$ = $1->addName( $2 ); }
-	| cfa_abstract_tuple identifier_or_type_name assignment_opt
+	| cfa_abstract_tuple identifier_or_type_name default_initialize_opt
 		// To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator).
 		{ $$ = $1->addName( $2 ); }
-	| type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt
+	| type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt
 		{ $$ = $2->addName( $3 )->addQualifiers( $1 ); }
 	| cfa_function_specifier
@@ -1867,10 +1904,10 @@
 parameter_declaration:
 		// No SUE declaration in parameter list.
-	declaration_specifier_nobody identifier_parameter_declarator assignment_opt
+	declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt
 		{
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
 			$$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
 		}
-	| declaration_specifier_nobody type_parameter_redeclarator assignment_opt
+	| declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt
 		{
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -1880,7 +1917,7 @@
 
 abstract_parameter_declaration:
-	declaration_specifier_nobody assignment_opt
+	declaration_specifier_nobody default_initialize_opt
 		{ $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
-	| declaration_specifier_nobody abstract_parameter_declarator assignment_opt
+	| declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt
 		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
 	;
@@ -3045,5 +3082,5 @@
 	;
 
-assignment_opt:
+default_initialize_opt:
 	// empty
 		{ $$ = nullptr; }
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/SymTab/Autogen.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Thu Mar 03 15:45:56 2016
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 28 15:30:00 2017
-// Update Count     : 61
+// Last Modified On : Fri Jul 14 16:41:00 2017
+// Update Count     : 62
 //
 
@@ -401,5 +401,5 @@
 	void makeStructFunctions( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd, const std::vector< FuncData > & data ) {
 		// Builtins do not use autogeneration.
-		if ( aggregateDecl->get_linkage() == LinkageSpec::Builtin ||
+		if ( aggregateDecl->get_linkage() == LinkageSpec::BuiltinCFA ||
 			 aggregateDecl->get_linkage() == LinkageSpec::BuiltinC ) {
 			return;
Index: src/SymTab/TreeStruct.cc
===================================================================
--- src/SymTab/TreeStruct.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
+++ src/SymTab/TreeStruct.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -0,0 +1,228 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// TreeStruct.cc --
+//
+// Author           : Andrew Beach
+// Created On       : Wed Jul 12 14:48:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Jul 14 15:49:00 2017
+// Update Count     : 0
+//
+
+#include "Common/PassVisitor.h"
+#include "InitTweak/InitTweak.h"
+#include "SynTree/Attribute.h"
+#include "SynTree/Declaration.h"
+#include "SynTree/Expression.h"
+#include "SynTree/Statement.h"
+#include "SynTree/Type.h"
+#include "SynTree/Mutator.h"
+
+__attribute__((noinline))
+Declaration* searchDeclList(
+        const std::list< Declaration* > & lst,
+        const Declaration * val ) {
+    auto tmp = std::find( lst.begin(), lst.end(), val );
+	return (tmp == lst.end()) ? nullptr : *tmp;
+}
+
+
+class TreeStructExpanderCore : public WithDeclsToAdd {
+	typedef std::pair<StructDecl *, ObjectDecl *> map_pair;
+	typedef std::map<std::string, map_pair> map;
+	typedef std::pair<map::iterator, bool> insert_result;
+	// std::pair<std::map<std::string,
+	//                    std::pair<StructDecl *,
+	//                              ObjectDecl *> >,
+	//           bool>
+
+	// key_name     first first
+	std::string key_name( std::pair<map::iterator, bool> & result )
+	{ return result.first->first; }
+	// struct_decl  first second first
+	StructDecl *& struct_decl( std::pair<map::iterator, bool> & result )
+	{ return result.first->second.first; }
+	// type_object  first second second
+	ObjectDecl *& type_object( std::pair<map::iterator, bool> & result )
+	{ return result.first->second.second; }
+	// key_name     first
+	std::string key_name( map::iterator & it ) { return it->first; }
+	// struct_decl  second first
+	StructDecl *& struct_decl( map::iterator & it )
+	{ return it->second.first; }
+	// type_object  second second
+	ObjectDecl *& type_object( map::iterator & it )
+	{ return it->second.second; }
+
+	StructDecl * type_object_type;
+
+	map known_structs;
+
+public:
+
+	TreeStructExpanderCore() : type_object_type( nullptr ) {}
+
+	std::string base_type_object_name( std::string struct_name ) {
+		return std::string("type_object_for_") + struct_name;
+	}
+
+	// Throws SemanticError if error is found.
+	Declaration * postmutate( StructDecl * node ) {
+		// Skip all untagged nodes.
+		if ( ! node->get_tagged() ) {
+			// Although we do grap the type object first.
+			if ( "__cfa__type_object" == node->get_name() ) {
+				assert( !type_object_type && "repeated type_object definition" );
+				type_object_type = node;
+			}
+			return node;
+		} else {
+			assert( type_object_type && "missing type_object definition" );
+		}
+
+		// Track all of the tagged nodes.
+		std::pair<map::iterator, bool> target = known_structs.insert(
+			std::make_pair( node->get_name(), map_pair( node, nullptr) ) );
+
+		// Validate no conflict (is that does elsewhere?)
+		// New declaration, no conflicting definition possible.
+		if ( target.second ) {
+			;
+		// Conflict if they have different parents.
+		} else if ( node->get_parentName() !=
+		            struct_decl( target )->get_parentName() ) {
+			throw SemanticError("TreeStructs do not share parents.");
+		// Conflict if they both have a body.
+		} else if ( node->has_body() && struct_decl( target )->has_body() ) {
+			throw SemanticError("TreeStructs with repeated bodies.");
+		// Update to the one with a body.
+		} else if ( node->has_body() ) {
+			struct_decl( target ) = node;
+		}
+
+		// if ( node->get_name() == node->get_parent_name() )
+		// We might actually use this for a while to say no parent.
+
+		// Validate Parent exists:
+		map::iterator target_parent =
+			known_structs.find( node->get_parentName() );
+		if ( known_structs.end() == target_parent && node->has_parent() ) {
+			throw SemanticError( std::string( "No <parent> named " ) +
+			                     node->get_parentName() + " defined." );
+		}
+
+		static Attribute linkonce( "section", std::list<Expression *>{
+			new NameExpr( "\".gnu.linkonce.exception\"" ) } );
+
+		Expression * parent_address = node->has_parent()
+			? (Expression *)new AddressExpr(
+				new VariableExpr( target_parent->second.second ) )
+			: (Expression *)new ConstantExpr( Constant::null(
+				new PointerType( Type::Qualifiers(),
+					new StructInstType( Type::Qualifiers(),
+					                    type_object_type ) ) ) );
+
+		// Insert the declaration of the type object.
+		ObjectDecl * type_object_inst = new ObjectDecl(
+			base_type_object_name( node->get_name() ),
+			Type::StorageClasses() /* I think this is none. */,
+			node->get_linkage(),
+			nullptr,
+			new StructInstType(
+				Type::Qualifiers(),
+				type_object_type
+				),
+			new ListInit({ new SingleInit( parent_address ) }),
+			std::list<Attribute *>{ linkonce.clone() }
+			);
+
+		declsToAddAfter.push_back( type_object_inst );
+
+		type_object( target ) = type_object_inst;
+
+		// Insert a field into the structure.
+		node->get_members().push_front( new ObjectDecl(
+			"tag",
+			Type::StorageClasses(),
+			node->get_linkage(),
+			nullptr,
+			new PointerType(
+				Type::Qualifiers( Type::Const ),
+				new StructInstType(
+					Type::Qualifiers( Type::Const ),
+					type_object_type
+					)
+				),
+			nullptr /*new SingleInit( new AddressExpr(
+				new VariableExpr( type_object_inst ) ) )*/
+			) );
+
+		return node;
+	}
+
+	DeclarationWithType * postmutate( FunctionDecl * funcDecl ) {
+		if ( ! InitTweak::isConstructor( funcDecl->get_name() ) ) {
+			return funcDecl;
+		}
+
+		if ( nullptr == funcDecl->get_statements() ) {
+			return funcDecl;
+		}
+
+		DeclarationWithType * param_one =
+			funcDecl->get_functionType()->get_parameters().front();
+		Type * param_one_t =
+			InitTweak::getPointerBase( param_one->get_type() );
+		StructInstType * struct_one_t =
+			dynamic_cast<StructInstType*>( param_one_t );
+
+		if ( struct_one_t && struct_one_t->get_baseStruct()->get_tagged() ) {
+			map::iterator target =
+	            known_structs.find( struct_one_t->get_name() );
+			assertf( known_structs.end() != target,
+			         "Missing definition of structure." );
+
+			DeclarationWithType * ptto_field =
+				dynamic_cast<DeclarationWithType*>(
+					struct_decl( target )->get_members().front() );
+			assertf( ptto_field, "Pointer to type object not found." );
+
+			Type * mutptr = ptto_field->get_type()->clone();
+			mutptr->set_const( false );
+			mutptr = new PointerType(Type::Qualifiers(), mutptr);
+
+			funcDecl->get_statements()->push_front( new ExprStmt( noLabels,
+				new UntypedExpr( new NameExpr( "?{}" ),
+					std::list<Expression *>{
+						new CastExpr(
+							new AddressExpr(
+								new MemberExpr(
+									ptto_field,
+									UntypedExpr::createDeref(
+										new VariableExpr( param_one )
+										)
+									)
+								),
+								mutptr
+							),
+						new AddressExpr(
+							new VariableExpr( type_object( target ) )
+							)
+						}
+					)
+				) );
+		}
+		return funcDecl;
+	}
+};
+
+// ?{}((type_object const**)&this->tag, &<type_object> )
+
+void expand_tree_structs( std::list<Declaration *> & translationUnit ) {
+	PassVisitor<TreeStructExpanderCore> translator;
+	mutateAll( translationUnit, translator );
+}
Index: src/SymTab/TreeStruct.h
===================================================================
--- src/SymTab/TreeStruct.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
+++ src/SymTab/TreeStruct.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -0,0 +1,24 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// TreeStruct.h --
+//
+// Author           : Andrew Beach
+// Created On       : Wed Jul 12 14:58:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Jul 14 11:15:00 2017
+// Update Count     : 0
+//
+
+// Various additions to make the translator for tree structures (hierarchy).
+// NOTE: Probably shouldn't be in SymTab.
+// NOTE: The name tree struct is temperay, we need the actual name.
+
+#include <list>
+
+class Declaration;
+
+void expand_tree_structs( std::list<Declaration *> & translationUnit );
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/SymTab/module.mk	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,7 +10,7 @@
 ## Author           : Richard C. Bilson
 ## Created On       : Mon Jun  1 17:49:17 2015
-## Last Modified By : Rob Schluntz
-## Last Modified On : Tue Jul 07 16:22:23 2015
-## Update Count     : 2
+## Last Modified By : Andrew Beach
+## Last Modified On : Wed Jul 12 13:06:00 2017
+## Update Count     : 3
 ###############################################################################
 
@@ -21,3 +21,4 @@
        SymTab/ImplementationType.cc \
        SymTab/TypeEquality.cc \
-       SymTab/Autogen.cc
+       SymTab/Autogen.cc \
+       SymTab/TreeStruct.cc
Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/SynTree/Constant.cc	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Jun 22 10:11:00 2017
-// Update Count     : 28
+// Last Modified On : Fri Jul 14 14:50:00 2017
+// Update Count     : 29
 //
 
@@ -46,4 +46,15 @@
 }
 
+Constant Constant::null( Type * ptrtype ) {
+	if ( nullptr == ptrtype ) {
+		ptrtype = new PointerType(
+			Type::Qualifiers(),
+			new VoidType( Type::Qualifiers() )
+			);
+	}
+
+	return Constant( ptrtype, "0", (unsigned long long int)0 );
+}
+
 unsigned long long Constant::get_ival() const {
 	assertf( safe_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve ival from non-integer constant." );
Index: src/SynTree/Constant.h
===================================================================
--- src/SynTree/Constant.h	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/SynTree/Constant.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Jun 22 10:13:00 2017
-// Update Count     : 15
+// Last Modified On : Fri Jul 14 13:33:00 2017
+// Update Count     : 16
 //
 
@@ -44,4 +44,7 @@
 	static Constant from_double( double d );
 
+	/// generates a null pointer value for the given type. void * if omitted.
+	static Constant null( Type * ptrtype = nullptr );
+
 	virtual void accept( Visitor & v ) { v.visit( this ); }
 	virtual Constant * acceptMutator( Mutator & m ) { return m.mutate( this ); }
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/SynTree/Declaration.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tus Jun 27 15:31:00 2017
-// Update Count     : 122
+// Last Modified On : Fri Jul 14 16:59:00 2017
+// Update Count     : 123
 //
 
@@ -266,5 +266,6 @@
 	typedef AggregateDecl Parent;
   public:
-	StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
+	StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ), tagged( false ), parent_name( "" ) {}
+	StructDecl( const std::string &name, const std::string *parent, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( DeclarationNode::Struct ), tagged( true ), parent_name( parent ? *parent : "" ) {}
 	StructDecl( const StructDecl &other ) : Parent( other ) {}
 
@@ -273,4 +274,10 @@
 	bool is_thread() { return kind == DeclarationNode::Thread; }
 
+	// Tagged/Tree Structure Excetion
+	bool get_tagged() { return tagged; }
+	void set_tagged( bool newValue ) { tagged = newValue; }
+	bool has_parent() { return parent_name != ""; }
+	std::string get_parentName() { return parent_name; }
+
 	virtual StructDecl *clone() const { return new StructDecl( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -279,4 +286,7 @@
 	DeclarationNode::Aggregate kind;
 	virtual std::string typeString() const;
+
+	bool tagged;
+	std::string parent_name;
 };
 
Index: src/libcfa/Makefile.am
===================================================================
--- src/libcfa/Makefile.am	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/libcfa/Makefile.am	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:54:01 2015
 ## Last Modified By : Andrew Beach
-## Last Modified On : Wed Jun 28 15:36:00 2017
-## Update Count     : 215
+## Last Modified On : Fri Jun 14 17:00:00 2017
+## Update Count     : 216
 ###############################################################################
 
@@ -51,5 +51,6 @@
 
 libobjs = ${headers:=.o}
-libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} exception.c
+libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
+	exception.c typeobject.c
 
 # not all platforms support concurrency, add option do disable it
@@ -68,8 +69,14 @@
 	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
 
+libcfa_a-typeobject.o : typeobject.c
+	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
+
 concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
 	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
 
 libcfa_d_a-exception.o : exception.c
+	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
+
+libcfa_d_a-typeobject.o : typeobject.c
 	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
 
Index: src/libcfa/Makefile.in
===================================================================
--- src/libcfa/Makefile.in	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/libcfa/Makefile.in	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -154,6 +154,7 @@
 	concurrency/coroutine.c concurrency/thread.c \
 	concurrency/kernel.c concurrency/monitor.c exception.c \
-	concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
-	concurrency/invoke.c concurrency/preemption.c
+	typeobject.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
+	concurrency/alarm.c concurrency/invoke.c \
+	concurrency/preemption.c
 am__dirstamp = $(am__leading_dot)dirstamp
 @BUILD_CONCURRENCY_TRUE@am__objects_1 = concurrency/libcfa_d_a-coroutine.$(OBJEXT) \
@@ -177,5 +178,6 @@
 	libcfa_d_a-interpose.$(OBJEXT) \
 	libhdr/libcfa_d_a-libdebug.$(OBJEXT) $(am__objects_2) \
-	libcfa_d_a-exception.$(OBJEXT) $(am__objects_3)
+	libcfa_d_a-exception.$(OBJEXT) libcfa_d_a-typeobject.$(OBJEXT) \
+	$(am__objects_3)
 am_libcfa_d_a_OBJECTS = $(am__objects_4)
 libcfa_d_a_OBJECTS = $(am_libcfa_d_a_OBJECTS)
@@ -188,6 +190,7 @@
 	concurrency/coroutine.c concurrency/thread.c \
 	concurrency/kernel.c concurrency/monitor.c exception.c \
-	concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
-	concurrency/invoke.c concurrency/preemption.c
+	typeobject.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
+	concurrency/alarm.c concurrency/invoke.c \
+	concurrency/preemption.c
 @BUILD_CONCURRENCY_TRUE@am__objects_5 = concurrency/libcfa_a-coroutine.$(OBJEXT) \
 @BUILD_CONCURRENCY_TRUE@	concurrency/libcfa_a-thread.$(OBJEXT) \
@@ -209,5 +212,6 @@
 	libcfa_a-interpose.$(OBJEXT) \
 	libhdr/libcfa_a-libdebug.$(OBJEXT) $(am__objects_6) \
-	libcfa_a-exception.$(OBJEXT) $(am__objects_7)
+	libcfa_a-exception.$(OBJEXT) libcfa_a-typeobject.$(OBJEXT) \
+	$(am__objects_7)
 am_libcfa_a_OBJECTS = $(am__objects_8)
 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
@@ -417,5 +421,5 @@
 libobjs = ${headers:=.o}
 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
-	exception.c $(am__append_4)
+	exception.c typeobject.c $(am__append_4)
 libcfa_a_SOURCES = ${libsrc}
 libcfa_a_CFLAGS = -nodebug -O2
@@ -593,4 +597,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-rational.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-stdlib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-typeobject.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-assert.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-exception.Po@am__quote@
@@ -604,4 +609,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-rational.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-stdlib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-typeobject.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@MACHINE_TYPE@.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-alarm.Po@am__quote@
@@ -928,4 +934,11 @@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
 
+libcfa_d_a-typeobject.obj: typeobject.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-typeobject.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-typeobject.Tpo -c -o libcfa_d_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-typeobject.Tpo $(DEPDIR)/libcfa_d_a-typeobject.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='typeobject.c' object='libcfa_d_a-typeobject.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
+
 concurrency/libcfa_d_a-alarm.o: concurrency/alarm.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-alarm.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-alarm.Tpo -c -o concurrency/libcfa_d_a-alarm.o `test -f 'concurrency/alarm.c' || echo '$(srcdir)/'`concurrency/alarm.c
@@ -1228,4 +1241,11 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
+
+libcfa_a-typeobject.obj: typeobject.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-typeobject.obj -MD -MP -MF $(DEPDIR)/libcfa_a-typeobject.Tpo -c -o libcfa_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-typeobject.Tpo $(DEPDIR)/libcfa_a-typeobject.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='typeobject.c' object='libcfa_a-typeobject.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
 
 concurrency/libcfa_a-alarm.o: concurrency/alarm.c
@@ -1521,8 +1541,14 @@
 	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
 
+libcfa_a-typeobject.o : typeobject.c
+	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
+
 concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
 	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
 
 libcfa_d_a-exception.o : exception.c
+	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
+
+libcfa_d_a-typeobject.o : typeobject.c
 	${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
 
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/libcfa/iostream.c	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul  6 18:14:17 2017
-// Update Count     : 396
+// Last Modified On : Sun Jul 16 21:12:03 2017
+// Update Count     : 398
 //
 
@@ -125,9 +125,6 @@
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype * os, float _Complex fc ) {
-	os | crealf( fc );
-	_Bool temp = sepDisable( os );						// disable separators within complex value
-	if ( cimagf( fc ) >= 0 ) os | '+';					// negative value prints '-'
-	os | cimagf( fc ) | 'i';
-	sepReset( os, temp );								// reset separator
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%g%+gi", crealf( fc ), cimagf( fc ) );
 	return os;
 } // ?|?
@@ -135,9 +132,6 @@
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype * os, double _Complex dc ) {
-	os | creal( dc );
-	_Bool temp = sepDisable( os );						// disable separators within complex value
-	if ( cimag( dc ) >= 0 ) os | '+';					// negative value prints '-'
-	os | cimag( dc ) | 'i';
-	sepReset( os, temp );								// reset separator
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%.*lg%+.*lgi", DBL_DIG, creal( dc ), DBL_DIG, cimag( dc ) );
 	return os;
 } // ?|?
@@ -145,9 +139,6 @@
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype * os, long double _Complex ldc ) {
-	os | creall( ldc );
-	_Bool temp = sepDisable( os );						// disable separators within complex value
-	if ( cimagl( ldc ) >= 0 ) os | '+';					// negative value prints '-'
-	os | cimagl( ldc ) | 'i';
-	sepReset( os, temp );								// reset separator
+	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+	fmt( os, "%.*Lg%+.*Lgi", LDBL_DIG, creall( ldc ), LDBL_DIG, cimagl( ldc ) );
 	return os;
 } // ?|?
Index: src/libcfa/typeobject.c
===================================================================
--- src/libcfa/typeobject.c	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
+++ src/libcfa/typeobject.c	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -0,0 +1,27 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// typeobject.c --
+//
+// Author           : Andrew Beach
+// Created On       : Tus Jul 11 15:10:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Tus Jul 12 16:04:00 2017
+// Update Count     : 0
+//
+
+#include "typeobject.h"
+
+// Takes in two non-null pointers to type_objects.
+int is_parent( struct __cfa__type_object const * parent,
+               struct __cfa__type_object const * child ) {
+	do {
+		if ( parent == child )
+			return 1;
+		child = child->parent;
+	} while ( child );
+	return 0;
+}
Index: src/libcfa/typeobject.h
===================================================================
--- src/libcfa/typeobject.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
+++ src/libcfa/typeobject.h	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -0,0 +1,28 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// typeobject.h -- Builtins for hierarchy objects.
+//
+// Author           : Andrew Beach
+// Created On       : Tus Jul 11 15:08:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Tus Jul 11 16:18:00 2017
+// Update Count     : 0
+//
+
+#pragma once
+#ifndef TYPEOBJECT_H
+#define TYPEOBJECT_H
+
+struct __cfa__type_object {
+    struct __cfa__type_object const * const parent;
+};
+
+// Takes in two non-null pointers to type_objects.
+int is_parent( struct __cfa__type_object const * parent,
+               struct __cfa__type_object const * child );
+
+#endif // TYPEOBJECT_H
Index: src/tests/gmp.c
===================================================================
--- src/tests/gmp.c	(revision e60e0dc41c51d3729b99dd9bd3c6864794d982ce)
+++ src/tests/gmp.c	(revision 5bd0aad2eb20d7e1f1b3a2f5e19678c448dd7e13)
@@ -10,6 +10,6 @@
 // Created On       : Tue Apr 19 08:55:51 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 24 22:05:38 2017
-// Update Count     : 540
+// Last Modified On : Thu Jul 13 16:35:01 2017
+// Update Count     : 541
 // 
 
@@ -95,4 +95,4 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa gmp.c -l gmp" //
+// compile-command: "cfa gmp.c -lgmp" //
 // End: //
