Index: src/ResolvExpr/SatisfyAssertions.cpp
===================================================================
--- src/ResolvExpr/SatisfyAssertions.cpp	(revision 81da70a5fabf0e44bf05c7b927e395b9e4c76239)
+++ src/ResolvExpr/SatisfyAssertions.cpp	(revision e67a82d79e32a55496140aa883716d9123ccc7f7)
@@ -188,5 +188,5 @@
 
 				matches.emplace_back( 
-					cdata, adjType, std::move( newEnv ), std::move( newNeed ), std::move( have ), 
+					cdata, adjType, std::move( newEnv ), std::move( have ), std::move( newNeed ),
 					std::move( newOpen ), crntResnSlot );
 			}
@@ -231,8 +231,9 @@
 		const ast::Expr * postvisit( const ast::Expr * expr ) {
 			// Skip if no slots to find
-			if ( expr->inferred.mode != ast::Expr::InferUnion::Slots ) return expr;
-
+			if ( !expr->inferred.hasSlots() ) return expr;
+			// if ( expr->inferred.mode != ast::Expr::InferUnion::Slots ) return expr;
+			std::vector<UniqueId> missingSlots;
 			// find inferred parameters for resolution slots
-			ast::InferredParams newInferred;
+			ast::InferredParams * newInferred = new ast::InferredParams();
 			for ( UniqueId slot : expr->inferred.resnSlots() ) {
 				// fail if no matching assertions found
@@ -240,4 +241,5 @@
 				if ( it == inferred.end() ) {
 					std::cerr << "missing assertion " << slot << std::endl;
+					missingSlots.push_back(slot);
 					continue;
 				}
@@ -247,5 +249,5 @@
 					// recurse on inferParams of resolved expressions
 					entry.second.expr = postvisit( entry.second.expr );
-					auto res = newInferred.emplace( entry );
+					auto res = newInferred->emplace( entry );
 					assert( res.second && "all assertions newly placed" );
 				}
@@ -253,5 +255,6 @@
 
 			ast::Expr * ret = mutate( expr );
-			ret->inferred.set_inferParams( std::move( newInferred ) );
+			ret->inferred.set_inferParams( newInferred );
+			if (!missingSlots.empty()) ret->inferred.resnSlots() = missingSlots;
 			return ret;
 		}
