Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/AggregateDecl.cc	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 23:56:39 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug  4 14:22:00 2017
-// Update Count     : 22
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 16:31:55 2019
+// Update Count     : 29
 //
 
@@ -21,7 +21,15 @@
 #include "Common/utility.h"      // for printAll, cloneAll, deleteAll
 #include "Declaration.h"         // for AggregateDecl, TypeDecl, Declaration
+#include "Initializer.h"
 #include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
 #include "Type.h"                // for Type, Type::StorageClasses
 
+
+// These must harmonize with the corresponding AggregateDecl::Aggregate enumerations.
+static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName" };
+
+const char * AggregateDecl::aggrString( AggregateDecl::Aggregate aggr ) {
+	return aggregateNames[aggr];
+}
 
 AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, Type::StorageClasses(), linkage ), body( false ), attributes( attributes ) {
@@ -78,11 +86,11 @@
 }
 
-std::string StructDecl::typeString() const { return "struct"; }
+const char * StructDecl::typeString() const { return aggrString( kind ); }
 
-std::string UnionDecl::typeString() const { return "union"; }
+const char * UnionDecl::typeString() const { return aggrString( Union ); }
 
-std::string EnumDecl::typeString() const { return "enum"; }
+const char * EnumDecl::typeString() const { return aggrString( Enum ); }
 
-std::string TraitDecl::typeString() const { return "trait"; }
+const char * TraitDecl::typeString() const { return aggrString( Trait ); }
 
 bool EnumDecl::valueOf( Declaration * enumerator, long long int & value ) {
Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/Declaration.cc	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  9 14:38:00 2017
-// Update Count     : 25
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 16:39:56 2019
+// Update Count     : 36
 //
 
@@ -24,6 +24,8 @@
 #include "SynTree/Statement.h"       // for AsmStmt
 #include "SynTree/SynTree.h"         // for UniqueId
+#include "SynTree/Expression.h"
 #include "Type.h"                    // for Type, Type::StorageClasses
 
+// To canonicalize declarations
 static UniqueId lastUniqueId = 0;
 
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/Declaration.h	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr May  2 10:47:00 2019
-// Update Count     : 135
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 16:48:20 2019
+// Update Count     : 149
 //
 
@@ -25,5 +25,4 @@
 #include "Mutator.h"             // for Mutator
 #include "Parser/LinkageSpec.h"  // for Spec, Cforall
-#include "Parser/ParseNode.h"    // for DeclarationNode, DeclarationNode::Ag...
 #include "SynTree.h"             // for UniqueId
 #include "SynTree/Type.h"        // for Type, Type::StorageClasses, Type::Fu...
@@ -194,5 +193,5 @@
 	std::list< DeclarationWithType* >& get_assertions() { return assertions; }
 
-	virtual std::string typeString() const = 0;
+	virtual const char * typeString() const = 0;
 
 	virtual NamedTypeDecl *clone() const override = 0;
@@ -237,6 +236,6 @@
 	TypeDecl * set_sized( bool newValue ) { sized = newValue; return this; }
 
-	virtual std::string typeString() const override;
-	virtual std::string genTypeString() const;
+	virtual const char * typeString() const override;
+	virtual const char * genTypeString() const;
 
 	virtual TypeDecl *clone() const override { return new TypeDecl( *this ); }
@@ -257,5 +256,5 @@
 	TypedefDecl( const TypedefDecl &other ) : Parent( other ) {}
 
-	virtual std::string typeString() const override;
+	virtual const char * typeString() const override;
 
 	virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); }
@@ -269,4 +268,7 @@
 	typedef Declaration Parent;
   public:
+	enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };
+	static const char * aggrString( Aggregate aggr );
+
 	std::list<Declaration*> members;
 	std::list<TypeDecl*> parameters;
@@ -291,5 +293,5 @@
 	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
   protected:
-	virtual std::string typeString() const = 0;
+	virtual const char * typeString() const = 0;
 };
 
@@ -297,10 +299,10 @@
 	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, Aggregate kind = Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
 	StructDecl( const StructDecl &other ) : Parent( other ), kind( other.kind ) {}
 
-	bool is_coroutine() { return kind == DeclarationNode::Coroutine; }
-	bool is_monitor() { return kind == DeclarationNode::Monitor; }
-	bool is_thread() { return kind == DeclarationNode::Thread; }
+	bool is_coroutine() { return kind == Coroutine; }
+	bool is_monitor() { return kind == Monitor; }
+	bool is_thread() { return kind == Thread; }
 
 	virtual StructDecl *clone() const override { return new StructDecl( *this ); }
@@ -308,7 +310,7 @@
 	virtual void accept( Visitor & v ) const override { v.visit( this ); }
 	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	DeclarationNode::Aggregate kind;
-  private:
-	virtual std::string typeString() const override;
+	Aggregate kind;
+  private:
+	virtual const char * typeString() const override;
 };
 
@@ -324,5 +326,5 @@
 	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
   private:
-	virtual std::string typeString() const override;
+	virtual const char * typeString() const override;
 };
 
@@ -341,5 +343,5 @@
   private:
 	std::unordered_map< std::string, long long int > enumValues;
-	virtual std::string typeString() const override;
+	virtual const char * typeString() const override;
 };
 
@@ -357,5 +359,5 @@
 	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
   private:
-	virtual std::string typeString() const override;
+	virtual const char * typeString() const override;
 };
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/Expression.cc	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Aug 15 13:43:00 2019
-// Update Count     : 64
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 07:55:15 2019
+// Update Count     : 70
 //
 
@@ -22,5 +22,4 @@
 
 #include "Common/utility.h"          // for maybeClone, cloneAll, deleteAll
-#include "Declaration.h"             // for ObjectDecl, DeclarationWithType
 #include "Expression.h"              // for Expression, ImplicitCopyCtorExpr
 #include "InitTweak/InitTweak.h"     // for getCallArg, getPointerBase
@@ -294,5 +293,5 @@
 }
 
-KeywordCastExpr::KeywordCastExpr( Expression * arg, Target target ) : Expression(), arg(arg), target( target ) {
+KeywordCastExpr::KeywordCastExpr( Expression * arg, AggregateDecl::Aggregate target ) : Expression(), arg(arg), target( target ) {
 }
 
@@ -304,13 +303,6 @@
 }
 
-const std::string & KeywordCastExpr::targetString() const {
-	static const std::string targetStrs[] = {
-		"coroutine", "thread", "monitor"
-	};
-	static_assert(
-		(sizeof(targetStrs) / sizeof(targetStrs[0])) == ((unsigned long)NUMBER_OF_TARGETS),
-		"Each KeywordCastExpr::Target should have a corresponding string representation"
-	);
-	return targetStrs[(unsigned long)target];
+const char * KeywordCastExpr::targetString() const {
+	return AggregateDecl::aggrString( target );
 }
 
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/Expression.h	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Aug 15 13:46:00 2019
-// Update Count     : 54
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 16:50:19 2019
+// Update Count     : 60
 //
 
@@ -28,4 +28,5 @@
 #include "Label.h"                // for Label
 #include "Mutator.h"              // for Mutator
+#include "Declaration.h"          // for Aggregate
 #include "SynTree.h"              // for UniqueId
 #include "Visitor.h"              // for Visitor
@@ -229,19 +230,16 @@
 public:
 	Expression * arg;
-	enum Target {
-		Coroutine, Thread, Monitor, NUMBER_OF_TARGETS
-	};
 	struct Concrete {
 		std::string field;
 		std::string getter;
 	};
-	Target target;
+	AggregateDecl::Aggregate target;
 	Concrete concrete_target;
 
-	KeywordCastExpr( Expression * arg, Target target );
+	KeywordCastExpr( Expression * arg, AggregateDecl::Aggregate target );
 	KeywordCastExpr( const KeywordCastExpr & other );
 	virtual ~KeywordCastExpr();
 
-	const std::string & targetString() const;
+	const char * targetString() const;
 
 	virtual KeywordCastExpr * clone() const override { return new KeywordCastExpr( * this ); }
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/FunctionDecl.cc	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:33:41 2017
-// Update Count     : 74
+// Last Modified On : Sat Dec  7 17:40:09 2019
+// Update Count     : 75
 //
 
@@ -23,4 +23,5 @@
 #include "Common/utility.h"      // for maybeClone, printAll
 #include "Declaration.h"         // for FunctionDecl, FunctionDecl::Parent
+#include "Expression.h"
 #include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
 #include "Statement.h"           // for CompoundStmt
Index: src/SynTree/NamedTypeDecl.cc
===================================================================
--- src/SynTree/NamedTypeDecl.cc	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/NamedTypeDecl.cc	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  9 13:28:00 2017
-// Update Count     : 14
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 08:26:17 2019
+// Update Count     : 15
 //
 
@@ -78,5 +78,5 @@
 }
 
-std::string TypedefDecl::typeString() const { return "typedef"; }
+const char * TypedefDecl::typeString() const { return "typedef"; }
 
 // Local Variables: //
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision 3b0c8cb586be8d0301bb5c39e69256689eab55d9)
+++ src/SynTree/TypeDecl.cc	(revision eb46fdff930448aa318502e397b5bf1e395225d7)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  9 14:35:00 2017
-// Update Count     : 6
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 17:56:30 2019
+// Update Count     : 10
 //
 
@@ -18,4 +18,5 @@
 
 #include "Common/utility.h"  // for maybeClone
+#include "Parser/ParseNode.h"
 #include "Declaration.h"     // for TypeDecl, TypeDecl::Data, TypeDecl::Kind...
 #include "Type.h"            // for Type, Type::StorageClasses
@@ -31,13 +32,13 @@
 }
 
-std::string TypeDecl::typeString() const {
-	static const std::string kindNames[] = { "object type", "function type", "tuple type" };
+const char * TypeDecl::typeString() const {
+	static const char * kindNames[] = { "sized object type", "sized function type", "sized tuple type" };
 	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "typeString: kindNames is out of sync." );
 	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
-	return (isComplete() ? "sized " : "") + kindNames[ kind ];
+	return isComplete() ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
 }
 
-std::string TypeDecl::genTypeString() const {
-	static const std::string kindNames[] = { "dtype", "ftype", "ttype" };
+const char * TypeDecl::genTypeString() const {
+	static const char * kindNames[] = { "dtype", "ftype", "ttype" };
 	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
 	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
