Index: src/AST/Eval.hpp
===================================================================
--- src/AST/Eval.hpp	(revision 417117ea3f54c45c0a3977a8ca6d9f0924f73be9)
+++ src/AST/Eval.hpp	(revision 417117ea3f54c45c0a3977a8ca6d9f0924f73be9)
@@ -0,0 +1,37 @@
+//
+// 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.
+//
+// Eval.hpp --
+//
+// Author           : Aaron B. Moss
+// Created On       : Fri Jun 28 14:00:00 2019
+// Last Modified By : Aaron B. Moss
+// Created On       : Fri Jun 28 14:00:00 2019
+// Update Count     : 1
+//
+
+#include <string>
+#include <utility>
+
+#include "Expr.hpp"
+
+namespace ast {
+
+/// Create a new UntypedExpr with the given arguments
+template< typename... Args >
+UntypedExpr * call( const CodeLocation & loc, const std::string & name, Args &&... args ) {
+	return new UntypedExpr { 
+		loc, new NameExpr { loc, name }, 
+		std::vector< ptr< Expr > > { std::forward< Args >( args )... } };
+}
+
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 55b64769d5e1c45cb4b5d7f0b3dfa82322d8f3d2)
+++ src/AST/Expr.cpp	(revision 417117ea3f54c45c0a3977a8ca6d9f0924f73be9)
@@ -20,4 +20,5 @@
 #include <vector>
 
+#include "Eval.hpp"                // for call
 #include "GenericSubstitution.hpp"
 #include "Stmt.hpp"
@@ -51,7 +52,5 @@
 	assert( arg );
 
-	UntypedExpr * ret = new UntypedExpr{
-		loc, new NameExpr{loc, "*?"}, std::vector<ptr<Expr>>{ ptr<Expr>{ arg } }
-	};
+	UntypedExpr * ret = call( loc, "*?", arg );
 	if ( const Type * ty = arg->result ) {
 		const Type * base = InitTweak::getPointerBase( ty );
@@ -74,7 +73,5 @@
 	assert( lhs && rhs );
 
-	UntypedExpr * ret = new UntypedExpr{
-		loc, new NameExpr{loc, "?=?"}, std::vector<ptr<Expr>>{ ptr<Expr>{ lhs }, ptr<Expr>{ rhs } }
-	};
+	UntypedExpr * ret = call( loc, "?=?", lhs, rhs );
 	if ( lhs->result && rhs->result ) {
 		// if both expressions are typed, assumes that this assignment is a C bitwise assignment,
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 55b64769d5e1c45cb4b5d7f0b3dfa82322d8f3d2)
+++ src/AST/Pass.impl.hpp	(revision 417117ea3f54c45c0a3977a8ca6d9f0924f73be9)
@@ -1920,5 +1920,5 @@
 				guard_symtab guard { *this };
 				auto new_node = p.second->accept( *this );
-				if (new_node != p.second) mutated = false;
+				if (new_node != p.second) mutated = true;
 				new_map.insert({ p.first, new_node });
 			}
@@ -1936,5 +1936,5 @@
 				guard_symtab guard { *this };
 				auto new_node = p.second->accept( *this );
-				if (new_node != p.second) mutated = false;
+				if (new_node != p.second) mutated = true;
 				new_map.insert({ p.first, new_node });
 			}
Index: src/AST/TypeSubstitution.cpp
===================================================================
--- src/AST/TypeSubstitution.cpp	(revision 55b64769d5e1c45cb4b5d7f0b3dfa82322d8f3d2)
+++ src/AST/TypeSubstitution.cpp	(revision 417117ea3f54c45c0a3977a8ca6d9f0924f73be9)
@@ -183,7 +183,6 @@
 		// bind type variables from generic type instantiations
 		if ( auto decl = type->aggr() ) {
-			const std::vector<ptr<TypeDecl>> &baseParameters =  decl->params;
-			if (! type->params.empty()) {
-				for ( const TypeDecl * tyvar : baseParameters ) {
+			if ( ! type->params.empty() ) {
+				for ( const TypeDecl * tyvar : decl->params ) {
 					boundVars.insert( tyvar->name );
 				} // for
