Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 5c9b20cdbd8f11c2e3b1817c4e65a16c5f1e9a65)
+++ src/ResolvExpr/Resolver.cc	(revision 73973b686e82b8344cd01aa00e3ddd77f8c8813b)
@@ -1299,24 +1299,40 @@
 		// default value expressions have an environment which shouldn't be there and trips up
 		// later passes.
-		ast::ptr< ast::FunctionDecl > ret = functionDecl;
-		for ( unsigned i = 0; i < functionDecl->type->params.size(); ++i ) {
-			const ast::ptr< ast::DeclWithType > & d = functionDecl->type->params[i];
-
-			if ( const ast::ObjectDecl * obj = d.as< ast::ObjectDecl >() ) {
-				if ( const ast::SingleInit * init = obj->init.as< ast::SingleInit >() ) {
-					if ( init->value->env == nullptr ) continue;
-					// clone initializer minus the initializer environment
-					ast::chain_mutate( ret )
-						( &ast::FunctionDecl::type )
-							( &ast::FunctionType::params )[i]
-								( &ast::ObjectDecl::init )
-									( &ast::SingleInit::value )->env = nullptr;
-
-					assert( functionDecl != ret.get() || functionDecl->unique() );
-					assert( ! ret->type->params[i].strict_as< ast::ObjectDecl >()->init.strict_as< ast::SingleInit >()->value->env );
-				}
-			}
-		}
-		return ret.release();
+
+		// ast::ptr< ast::FunctionDecl > ret = functionDecl; 
+		// assert(functionDecl->type->unique());
+		assert(functionDecl->unique());
+		
+		auto mutType = mutate(functionDecl->type.get());
+
+		for ( unsigned i = 0; i < mutType->params.size(); ++i ) {
+			const ast::ptr< ast::DeclWithType > & d = mutType->params[i];
+            if ( const ast::ObjectDecl * obj = d.as< ast::ObjectDecl >() ) {
+                if ( const ast::SingleInit * init = obj->init.as< ast::SingleInit >() ) {
+                    if ( init->value->env == nullptr ) continue;
+                    // clone initializer minus the initializer environment
+                    // ast::FunctionDecl * mutDecl = mutate( functionDecl );
+                    // auto mutType = mutate( mutDecl->type.get() );
+                    auto mutParam = mutate( mutType->params[i].strict_as<ast::ObjectDecl>() );
+                    auto mutInit = mutate( mutParam->init.strict_as<ast::SingleInit>() );
+                    auto mutValue = mutate( mutInit->value.get() );
+                    //ast::chain_mutate( ret )
+                    //  ( &ast::FunctionDecl::type )
+                    //      ( &ast::FunctionType::params )[i]
+                    //          ( &ast::ObjectDecl::init )
+                    //              ( &ast::SingleInit::value )->env = nullptr;
+                    // assert( functionDecl != mutDecl || functionDecl->unique() );
+                    mutValue->env = nullptr;
+                    mutInit->value = mutValue;
+                    mutParam->init = mutInit;
+                    mutType->params[i] = mutParam;
+                    // mutDecl->type = mutType;
+                    // functionDecl = mutDecl;
+                    assert( ! mutType->params[i].strict_as< ast::ObjectDecl >()->init.strict_as< ast::SingleInit >()->value->env);
+                }
+            }
+		}
+		mutate_field(functionDecl, &ast::FunctionDecl::type, mutType);
+		return functionDecl;
 	}
 
