Index: src/ResolvExpr/ResolveAssertions.cc
===================================================================
--- src/ResolvExpr/ResolveAssertions.cc	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/ResolvExpr/ResolveAssertions.cc	(revision aaeacf4b17e26df880b846210c264be0d6cc771b)
@@ -50,7 +50,7 @@
 		UniqueId resnSlot;              ///< Slot for any recursive assertion IDs
 
-		AssnCandidate( const SymTab::Indexer::IdData& cdata, Type* adjType, TypeEnvironment&& env, 
-			AssertionSet&& have, AssertionSet&& need, OpenVarSet&& openVars, UniqueId resnSlot ) 
-		: cdata(cdata), adjType(adjType), env(std::move(env)), have(std::move(have)), 
+		AssnCandidate( const SymTab::Indexer::IdData& cdata, Type* adjType, TypeEnvironment&& env,
+			AssertionSet&& have, AssertionSet&& need, OpenVarSet&& openVars, UniqueId resnSlot )
+		: cdata(cdata), adjType(adjType), env(std::move(env)), have(std::move(have)),
 			need(std::move(need)), openVars(std::move(openVars)), resnSlot(resnSlot) {}
 	};
@@ -86,5 +86,5 @@
 	using DeferList = std::vector<DeferItem>;
 
-	/// Combo iterator that combines candidates into an output list, merging their environments. 
+	/// Combo iterator that combines candidates into an output list, merging their environments.
 	/// Rejects an appended candidate if the environments cannot be merged.
 	class CandidateEnvMerger {
@@ -97,5 +97,5 @@
 		/// Indexer to use for merges
 		const SymTab::Indexer& indexer;
-	
+
 	public:
 		/// The merged environment/open variables and the list of candidates
@@ -106,10 +106,10 @@
 			Cost cost;
 
-			OutType( const TypeEnvironment& env, const OpenVarSet& openVars, 
+			OutType( const TypeEnvironment& env, const OpenVarSet& openVars,
 				const std::vector<DeferRef>& assns )
 			: env(env), openVars(openVars), assns(assns), cost(Cost::infinity) {}
 		};
 
-		CandidateEnvMerger( const TypeEnvironment& env, const OpenVarSet& openVars, 
+		CandidateEnvMerger( const TypeEnvironment& env, const OpenVarSet& openVars,
 			const SymTab::Indexer& indexer )
 		: crnt(), envs{ env }, varSets{ openVars }, indexer(indexer) {}
@@ -137,5 +137,5 @@
 	};
 
-	/// Comparator for CandidateEnvMerger outputs that sums their costs and caches the stored 
+	/// Comparator for CandidateEnvMerger outputs that sums their costs and caches the stored
 	/// sums
 	struct CandidateCost {
@@ -156,11 +156,11 @@
 			for ( const auto& assn : x.assns ) {
 				// compute conversion cost from satisfying decl to assertion
-				k += computeConversionCost( 
+				k += computeConversionCost(
 					assn.match.adjType, assn.decl->get_type(), indexer, x.env );
-				
+
 				// mark vars+specialization cost on function-type assertions
 				FunctionType* func = GenPoly::getFunctionType( assn.match.cdata.id->get_type() );
 				if ( ! func ) continue;
-				
+
 				for ( DeclarationWithType* formal : func->parameters ) {
 					k.decSpec( specCost( formal->get_type() ) );
@@ -176,5 +176,5 @@
 			return k;
 		}
-		
+
 		/// compares elements by cost
 		bool operator() ( Element& a, Element& b ) const {
@@ -206,12 +206,12 @@
 		/// Updated resolution state with new need-list
 		ResnState( ResnState&& o, IterateFlag )
-		: alt(std::move(o.alt)), need(o.newNeed.begin(), o.newNeed.end()), newNeed(), deferred(), 
+		: alt(std::move(o.alt)), need(o.newNeed.begin(), o.newNeed.end()), newNeed(), deferred(),
 		  inferred(std::move(o.inferred)), indexer(o.indexer) {}
 	};
 
 	/// Binds a single assertion, updating resolution state
-	void bindAssertion( const DeclarationWithType* decl, AssertionSetValue info, Alternative& alt, 
+	void bindAssertion( const DeclarationWithType* decl, AssertionSetValue info, Alternative& alt,
 			AssnCandidate& match, InferCache& inferred ) {
-		
+
 		DeclarationWithType* candidate = match.cdata.id;
 		assertf( candidate->get_uniqueId(), "Assertion candidate does not have a unique ID: %s", toString( candidate ).c_str() );
@@ -224,5 +224,5 @@
 		// place newly-inferred assertion in proper place in cache
 		inferred[ info.resnSlot ][ decl->get_uniqueId() ] = ParamEntry{
-				candidate->get_uniqueId(), match.adjType->clone(), decl->get_type()->clone(), 
+				candidate->get_uniqueId(), candidate->clone(), match.adjType->clone(), decl->get_type()->clone(),
 				varExpr };
 	}
@@ -263,5 +263,5 @@
 
 			// keep unifying candidates
-			if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars, 
+			if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars,
 					resn.indexer ) ) {
 				// set up binding slot for recursive assertions
@@ -274,5 +274,5 @@
 				}
 
-				matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have), 
+				matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have),
 					std::move(newNeed), std::move(newOpenVars), crntResnSlot );
 			} else {
@@ -319,5 +319,5 @@
 				}
 				InferredParams& inferParams = it->second;
-				
+
 				// place inferred parameters into proper place in expression
 				for ( auto& entry : inferParams ) {
@@ -373,5 +373,5 @@
 						ss << (tabs-1) << "Could not satisfy assertion:\n";
 						assn.decl->print( ss, tabs );
-						
+
 						errors.emplace_back( ss.str() );
 						goto nextResn;
@@ -403,5 +403,5 @@
 					// resolve deferred assertions by mutual compatibility
 					std::vector<CandidateEnvMerger::OutType> compatible = filterCombos(
-						resn.deferred, 
+						resn.deferred,
 						CandidateEnvMerger{ resn.alt.env, resn.alt.openVars, resn.indexer } );
 					// fail early if no mutually-compatible assertion satisfaction
@@ -466,5 +466,5 @@
 			new_resns.clear();
 		}
-		
+
 		// exceeded recursion limit if reaches here
 		if ( out.empty() ) {
