Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/CodeGen/CodeGenerator.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -281,4 +281,8 @@
 		} // if
 		output << " }";
+	}
+
+	void CodeGenerator::visit( ConstructorInit * init ){
+		assertf( false, "ConstructorInit nodes should not make it to CodeGen." );
 	}
 
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/CodeGen/CodeGenerator.h	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -47,4 +47,5 @@
 		virtual void visit( SingleInit * );
 		virtual void visit( ListInit * );
+		virtual void visit( ConstructorInit * );
 
 		//*** Constant
Index: src/GenPoly/CopyParams.cc
===================================================================
--- src/GenPoly/CopyParams.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/GenPoly/CopyParams.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -38,4 +38,5 @@
 	};
 
+	/// creates local copies of polymorphic function parameters
 	void copyParams( std::list< Declaration* > &translationUnit ) {
 		CopyParams copier;
@@ -53,4 +54,5 @@
 			if ( ! modVars.empty() ) {
 				std::map< std::string, DeclarationWithType* > assignOps;
+				// xxx - this needs to use constructors, not assignment operators
 				// assume the assignment operator is the first assert param after any "type" parameter
 				for ( Type::ForallList::const_iterator tyVar = funcDecl->get_functionType()->get_forall().begin(); tyVar != funcDecl->get_functionType()->get_forall().end(); ++tyVar ) {
Index: src/GenPoly/PolyMutator.cc
===================================================================
--- src/GenPoly/PolyMutator.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/GenPoly/PolyMutator.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -149,15 +149,14 @@
 		ValueGuard< std::list< Statement* > > oldStmtsToAdd( stmtsToAdd );
 		ValueGuard< std::list< Statement* > > oldStmtsToAddAfter( stmtsToAddAfter );
+		ValueGuard< TypeSubstitution * > oldEnv( env );
 
-		// xxx - not sure if these are needed, along with appropriate assignments, but I don't think so...
-		// ValueGuard< TyVarMap > oldScopeTyVars;
-		// ValueGuard< TypeSubstitution * > oldEnv;
+		// xxx - not sure if this is needed, along with appropriate reset, but I don't think so...
+		// ValueGuard< TyVarMap > oldScopeTyVars( scopeTyVars );
 
 		stmtsToAdd.clear();
 		stmtsToAddAfter.clear();
+		// scopeTyVars.clear();
 
-		stmtExpr->set_result( maybeMutate( stmtExpr->get_result(), *this ) );
-		stmtExpr->set_statements( maybeMutate( stmtExpr->get_statements(), *this ) );
-		return stmtExpr;
+		return Parent::mutate( stmtExpr );
 	}
 
Index: src/ResolvExpr/TypeEnvironment.cc
===================================================================
--- src/ResolvExpr/TypeEnvironment.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/ResolvExpr/TypeEnvironment.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -32,5 +32,5 @@
 	//
 	// I've seen a TU go from 54 minutes to 1 minute 34 seconds with the addition of this comparator.
-	bool AssertCompare::operator()( DeclarationWithType * d1, DeclarationWithType * d2 ) {
+	bool AssertCompare::operator()( DeclarationWithType * d1, DeclarationWithType * d2 ) const {
 			// Objects are always less than functions
 			if ( ObjectDecl * objectDecl1 = dynamic_cast< ObjectDecl * >( d1 ) ) {
Index: src/ResolvExpr/TypeEnvironment.h
===================================================================
--- src/ResolvExpr/TypeEnvironment.h	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/ResolvExpr/TypeEnvironment.h	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -29,5 +29,5 @@
 namespace ResolvExpr {
 	struct AssertCompare {
-		bool operator()( DeclarationWithType * d1, DeclarationWithType * d2 );
+		bool operator()( DeclarationWithType * d1, DeclarationWithType * d2 ) const;
 	};
 	typedef std::map< DeclarationWithType*, bool, AssertCompare > AssertionSet;
Index: src/SymTab/Indexer.h
===================================================================
--- src/SymTab/Indexer.h	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/SymTab/Indexer.h	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -25,5 +25,5 @@
 	class Indexer : public Visitor {
 	  public:
-		Indexer( bool useDebug = false );
+		explicit Indexer( bool useDebug = false );
 
 		Indexer( const Indexer &that );
Index: src/SynTree/CompoundStmt.cc
===================================================================
--- src/SynTree/CompoundStmt.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/SynTree/CompoundStmt.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -49,13 +49,11 @@
 		Statement * origStmt = *origit++;
 		if ( DeclStmt * declStmt = dynamic_cast< DeclStmt * >( s ) ) {
-			DeclStmt * origDeclStmt = dynamic_cast< DeclStmt * >( origStmt );
-			assert( origDeclStmt );
+			DeclStmt * origDeclStmt = safe_dynamic_cast< DeclStmt * >( origStmt );
 			if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * > ( declStmt->get_decl() ) ) {
-				DeclarationWithType * origdwt = dynamic_cast< DeclarationWithType * > ( origDeclStmt->get_decl() );
-				assert( origdwt );
+				DeclarationWithType * origdwt = safe_dynamic_cast< DeclarationWithType * > ( origDeclStmt->get_decl() );
 				assert( dwt->get_name() == origdwt->get_name() );
 				declMap[ origdwt ] = dwt;
-			}
-		}
+			} else assert( ! dynamic_cast< DeclarationWithType * > ( origDeclStmt->get_decl() ) );
+		} else assert( ! dynamic_cast< DeclStmt * > ( s ) );
 	}
 	if ( ! declMap.empty() ) {
Index: src/SynTree/Initializer.cc
===================================================================
--- src/SynTree/Initializer.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/SynTree/Initializer.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -65,4 +65,10 @@
 }
 
+ListInit::ListInit( const ListInit & other ) : Initializer( other ) {
+	cloneAll( other.initializers, initializers );
+	cloneAll( other.designators, designators );
+}
+
+
 ListInit::~ListInit() {
 	deleteAll( initializers );
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/SynTree/Initializer.h	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -88,4 +88,5 @@
 	ListInit( const std::list<Initializer*> &initializers,
 			  const std::list<Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
+	ListInit( const ListInit & other );
 	virtual ~ListInit();
 
Index: src/SynTree/VarExprReplacer.cc
===================================================================
--- src/SynTree/VarExprReplacer.cc	(revision f7e749fe66afec27c3d97b647b99b4aaab0e6641)
+++ src/SynTree/VarExprReplacer.cc	(revision fc638d2176b72a88b406e73af7f7f9e548ae05f7)
@@ -21,4 +21,5 @@
 // replace variable with new node from decl map
 void VarExprReplacer::visit( VariableExpr * varExpr ) {
+  // xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
   if ( declMap.count( varExpr->get_var() ) ) {
     varExpr->set_var( declMap.at( varExpr->get_var() ) );
