Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 4ef08f76a55ae935c3aff3e628469cb6618b8ca8)
+++ src/ResolvExpr/Unify.cc	(revision da5f7de4d561ee725d5bf2bb2fc8838f45388a7e)
@@ -767,5 +767,5 @@
 		/// If this isn't done when satifying ttype assertions, then argument lists can have
 		/// different size and structure when they should be compatible.
-		struct TtypeExpander_new : public ast::WithShortCircuiting {
+		struct TtypeExpander_new : public ast::WithShortCircuiting, public ast::PureVisitor {
 			ast::TypeEnvironment & tenv;
 
@@ -793,6 +793,5 @@
 				// TtypeExpander pass is impure (may mutate nodes in place)
 				// need to make nodes shared to prevent accidental mutation
-				ast::ptr<ast::DeclWithType> dc = d;
-				dc = dc->accept( expander );
+				ast::ptr<ast::DeclWithType> dc = d->accept(expander);
 				auto types = flatten( dc->get_type() );
 				for ( ast::ptr< ast::Type > & t : types ) {
@@ -1114,8 +1113,8 @@
 			ast::Pass<TtypeExpander_new> expander{ tenv };
 
-			ast::ptr<ast::TupleType> tuplec = tuple;
-			ast::ptr<ast::TupleType> tuple2c = tuple2;
-			const ast::Type * flat = tuplec->accept( expander );
-			const ast::Type * flat2 = tuple2c->accept( expander );
+			// ast::ptr<ast::TupleType> tuplec = tuple;
+			// ast::ptr<ast::TupleType> tuple2c = tuple2;
+			const ast::Type * flat = tuple->accept( expander );
+			const ast::Type * flat2 = tuple2->accept( expander );
 
 			auto types = flatten( flat );
