Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 8ff586c75c5393ffce4e017d45e811a1466704c6)
+++ src/AST/Convert.cpp	(revision 81da70a5fabf0e44bf05c7b927e395b9e4c76239)
@@ -593,5 +593,5 @@
 				auto res = tgtInferParams.emplace(srcParam.first, ParamEntry(
 					srcParam.second.decl,
-					get<Declaration>().accept1(srcParam.second.declptr),
+					get<Declaration>().accept1(srcParam.second.declptr)->clone(),
 					get<Type>().accept1(srcParam.second.actualType),
 					get<Type>().accept1(srcParam.second.formalType),
Index: src/ResolvExpr/SatisfyAssertions.cpp
===================================================================
--- src/ResolvExpr/SatisfyAssertions.cpp	(revision 8ff586c75c5393ffce4e017d45e811a1466704c6)
+++ src/ResolvExpr/SatisfyAssertions.cpp	(revision 81da70a5fabf0e44bf05c7b927e395b9e4c76239)
@@ -229,5 +229,5 @@
 		InferMatcher( InferCache & inferred ) : inferred( inferred ) {}
 
-		const ast::Expr * postmutate( const ast::Expr * expr ) {
+		const ast::Expr * postvisit( const ast::Expr * expr ) {
 			// Skip if no slots to find
 			if ( expr->inferred.mode != ast::Expr::InferUnion::Slots ) return expr;
@@ -239,5 +239,6 @@
 				auto it = inferred.find( slot );
 				if ( it == inferred.end() ) {
-					assert(!"missing assertion");
+					std::cerr << "missing assertion " << slot << std::endl;
+					continue;
 				}
 
@@ -245,5 +246,5 @@
 				for ( auto & entry : it->second ) {
 					// recurse on inferParams of resolved expressions
-					entry.second.expr = postmutate( entry.second.expr );
+					entry.second.expr = postvisit( entry.second.expr );
 					auto res = newInferred.emplace( entry );
 					assert( res.second && "all assertions newly placed" );
