Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/SymTab/Indexer.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:37:33 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun  5 08:05:17 2015
-// Update Count     : 5
+// Last Modified On : Tue May 19 16:49:55 2015
+// Update Count     : 3
 //
 
@@ -51,29 +51,27 @@
 	}
 
-
-// A NOTE ON THE ORDER OF TRAVERSAL
-//
-// Types and typedefs have their base types visited before they are added to the type table.  This is ok, since there is
-// no such thing as a recursive type or typedef.
-//
-//             typedef struct { T *x; } T; // never allowed
-//
-// for structs/unions, it is possible to have recursion, so the decl should be added as if it's incomplete to begin, the
-// members are traversed, and then the complete type should be added (assuming the type is completed by this particular
-// declaration).
-//
-//             struct T { struct T *x; }; // allowed
-//
-// It is important to add the complete type to the symbol table *after* the members/base has been traversed, since that
-// traversal may modify the definition of the type and these modifications should be visible when the symbol table is
-// queried later in this pass.
-//
-// TODO: figure out whether recursive contexts are sensible/possible/reasonable.
-
+/********
+ * A NOTE ON THE ORDER OF TRAVERSAL
+ *
+ * Types and typedefs have their base types visited before they are added to the type table.
+ * This is ok, since there is no such thing as a recursive type or typedef.
+ *             typedef struct { T *x; } T; // never allowed
+ *
+ * for structs/unions, it is possible to have recursion, so the decl should be added as if it's
+ * incomplete to begin, the members are traversed, and then the complete type should be added
+ * (assuming the type is completed by this particular declaration).
+ *             struct T { struct T *x; }; // allowed
+ *
+ * It's important to add the complete type to the symbol table *after* the members/base has been
+ * traversed, since that traversal may modify the definition of the type and these modifications
+ * should be visible when the symbol table is queried later in this pass.
+ *
+ * TODO: figure out whether recursive contexts are sensible/possible/reasonable.
+ */
 
 	void Indexer::visit( TypeDecl *typeDecl ) {
 		// see A NOTE ON THE ORDER OF TRAVERSAL, above
-		// note that assertions come after the type is added to the symtab, since they are not part of the type proper
-		// and may depend on the type itself
+		// note that assertions come after the type is added to the symtab, since they aren't part
+		// of the type proper and may depend on the type itself
 		enterScope();
 		acceptAll( typeDecl->get_parameters(), *this );
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/SymTab/Mangler.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:40:29 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 15:12:12 2015
-// Update Count     : 8
+// Last Modified On : Tue May 19 16:50:47 2015
+// Update Count     : 3
 //
 
@@ -160,6 +160,7 @@
 		} else {
 			printQualifiers( typeInst );
-			std::ostringstream numStream;
+			std::ostrstream numStream;
 			numStream << varNum->second.first;
+			mangleName << (numStream.pcount() + 1);
 			switch ( (TypeDecl::Kind )varNum->second.second ) {
 			  case TypeDecl::Any:
@@ -173,5 +174,5 @@
 				break;
 			} // switch
-			mangleName << numStream.str();
+			mangleName << std::string( numStream.str(), numStream.pcount() );
 		} // if
 	}
@@ -219,5 +220,5 @@
 					sub_mangler.varNums = varNums;
 					(*assert)->accept( sub_mangler );
-					assertionNames.push_back( sub_mangler.mangleName.str() );
+					assertionNames.push_back( std::string( sub_mangler.mangleName.str(), sub_mangler.mangleName.pcount() ) );
 				} // for
 			} // for
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/SymTab/Mangler.h	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:44:03 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 14:47:14 2015
-// Update Count     : 5
+// Last Modified On : Tue May 19 16:49:21 2015
+// Update Count     : 3
 //
 
@@ -17,5 +17,5 @@
 #define MANGLER_H
 
-#include <sstream>
+#include <strstream>
 #include "SynTree/SynTree.h"
 #include "SynTree/Visitor.h"
@@ -43,7 +43,7 @@
 		virtual void visit( TupleType *tupleType );
   
-		std::string get_mangleName() { return mangleName.str(); }
+		std::string get_mangleName() { return std::string( mangleName.str(), mangleName.pcount() ); }
 	  private:
-		std::ostringstream mangleName;
+		std::ostrstream mangleName;
 		typedef std::map< std::string, std::pair< int, int > > VarMapType;
 		VarMapType varNums;
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/SymTab/Validate.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:50:04 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jun 24 16:20:50 2015
-// Update Count     : 30
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue May 19 16:50:09 2015
+// Update Count     : 3
 //
 
@@ -45,6 +45,6 @@
 #include "SynTree/Type.h"
 #include "SynTree/Statement.h"
+#include "Indexer.h"
 #include "SynTree/TypeSubstitution.h"
-#include "Indexer.h"
 #include "FixFunction.h"
 #include "ImplementationType.h"
@@ -176,6 +176,4 @@
 		acceptAll( translationUnit, pass1 );
 		acceptAll( translationUnit, pass2 );
-		// need to collect all of the assignment operators prior to
-		// this point and only generate assignment operators if one doesn't exist
 		AddStructAssignment::addStructAssignment( translationUnit );
 		acceptAll( translationUnit, pass3 );
@@ -508,5 +506,5 @@
 		if ( ! array->get_dimension() ) return;
   
-		ObjectDecl *index = new ObjectDecl( indexName.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), 0 );
+		ObjectDecl *index = new ObjectDecl( indexName.newName(), Declaration::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), 0 );
 		*out++ = new DeclStmt( noLabels, index );
   
@@ -546,32 +544,20 @@
 		FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
   
-		ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
+		ObjectDecl *returnVal = new ObjectDecl( "", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
 		assignType->get_returnVals().push_back( returnVal );
   
-		ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
+		ObjectDecl *dstParam = new ObjectDecl( "_dst", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
 		assignType->get_parameters().push_back( dstParam );
   
-		ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
+		ObjectDecl *srcParam = new ObjectDecl( "_src", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
 		assignType->get_parameters().push_back( srcParam );
 
 		// Routines at global scope marked "static" to prevent multiple definitions is separate translation units
 		// because each unit generates copies of the default routines for each aggregate.
-		FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false );
+		FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? Declaration::NoStorageClass : Declaration::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true );
 		assignDecl->fixUniqueId();
   
 		for ( std::list< Declaration * >::const_iterator member = aggregateDecl->get_members().begin(); member != aggregateDecl->get_members().end(); ++member ) {
 			if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member ) ) {
-				// query the type qualifiers of this field and skip assigning it if it is marked const. 
-				// If it is an array type, we need to strip off the array layers to find its qualifiers.
-				Type * type = dwt->get_type();
-				while ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
-					type = at->get_base();
-				}
-
-				if ( type->get_qualifiers().isConst ) {
-					// don't assign const members
-					continue;
-				}
-
 				if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) {
 					makeArrayAssignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
@@ -589,16 +575,16 @@
 		FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
   
-		ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
+		ObjectDecl *returnVal = new ObjectDecl( "", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
 		assignType->get_returnVals().push_back( returnVal );
   
-		ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
+		ObjectDecl *dstParam = new ObjectDecl( "_dst", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
 		assignType->get_parameters().push_back( dstParam );
   
-		ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
+		ObjectDecl *srcParam = new ObjectDecl( "_src", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
 		assignType->get_parameters().push_back( srcParam );
   
 		// Routines at global scope marked "static" to prevent multiple definitions is separate translation units
 		// because each unit generates copies of the default routines for each aggregate.
-		FunctionDecl *assignDecl = new FunctionDecl( "?=?",  functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false );
+		FunctionDecl *assignDecl = new FunctionDecl( "?=?",  functionNesting > 0 ? Declaration::NoStorageClass : Declaration::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true );
 		assignDecl->fixUniqueId();
   
@@ -635,6 +621,6 @@
 		TypeInstType *typeInst = new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), false );
 		typeInst->set_baseType( typeDecl );
-		ObjectDecl *src = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, typeInst->clone(), 0 );
-		ObjectDecl *dst = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), typeInst->clone() ), 0 );
+		ObjectDecl *src = new ObjectDecl( "_src", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, typeInst->clone(), 0 );
+		ObjectDecl *dst = new ObjectDecl( "_dst", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), typeInst->clone() ), 0 );
 		if ( typeDecl->get_base() ) {
 			stmts = new CompoundStmt( std::list< Label >() );
@@ -645,16 +631,18 @@
 		} // if
 		FunctionType *type = new FunctionType( Type::Qualifiers(), false );
-		type->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, typeInst, 0 ) );
+		type->get_returnVals().push_back( new ObjectDecl( "", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, typeInst, 0 ) );
 		type->get_parameters().push_back( dst );
 		type->get_parameters().push_back( src );
-		FunctionDecl *func = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::AutoGen, type, stmts, false, false );
+		FunctionDecl *func = new FunctionDecl( "?=?", Declaration::NoStorageClass, LinkageSpec::AutoGen, type, stmts, false );
 		declsToAdd.push_back( func );
 	}
 
 	void addDecls( std::list< Declaration * > &declsToAdd, std::list< Statement * > &statements, std::list< Statement * >::iterator i ) {
-		for ( std::list< Declaration * >::iterator decl = declsToAdd.begin(); decl != declsToAdd.end(); ++decl ) {
-			statements.insert( i, new DeclStmt( noLabels, *decl ) );
-		} // for
-		declsToAdd.clear();
+		if ( ! declsToAdd.empty() ) {
+			for ( std::list< Declaration * >::iterator decl = declsToAdd.begin(); decl != declsToAdd.end(); ++decl ) {
+				statements.insert( i, new DeclStmt( noLabels, *decl ) );
+			} // for
+			declsToAdd.clear();
+		} // if
 	}
 
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/SymTab/module.mk	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -1,18 +1,2 @@
-######################### -*- Mode: Makefile-Gmake -*- ########################
-##
-## 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.
-##
-## module.mk -- 
-##
-## Author           : Richard C. Bilson
-## Created On       : Mon Jun  1 17:49:17 2015
-## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jun  1 17:53:50 2015
-## Update Count     : 1
-###############################################################################
-
 SRC += SymTab/IdTable.cc \
        SymTab/Indexer.cc \
