Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 76a395a555cd3dd6f5f0eed8f581e1f1af4fa242)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision fae6f21adb40b4f21213c00786146d211814c241)
@@ -632,5 +632,15 @@
 			std::vector<ArgPack> finalResults{};  /// list of completed tuples
 			// start tuples
-			for ( ArgPack& result : results ) { result.beginTuple(); }
+			for ( ArgPack& result : results ) {
+				result.beginTuple();
+
+				// use rest of exploded tuple if present
+				while ( result.nextExpl < result.expls.size() ) {
+					const Alternative& actual = result.expls[result.nextExpl];
+					result.env.addActual( actual.env, result.openVars );
+					result.withArg( actual.expr );
+					++result.nextExpl;
+				}
+			}
 			// iterate until all results completed
 			while ( ! results.empty() ) {
@@ -760,8 +770,6 @@
 					// add argument
 					aResult.withArg( aActual.expr, actual.cost );
-					if ( exploded.size() == 1 ) {
-						// argument consumed
-						++aResult.nextArg;
-					} else {
+					++aResult.nextArg;
+					if ( exploded.size() > 1 ) {
 						// other parts of tuple left over
 						aResult.expls = std::move( exploded );
@@ -815,4 +823,14 @@
 		std::vector<ArgPack> finalResults{};
 		if ( funcType->get_isVarArgs() ) {
+			for ( ArgPack& result : results ) {
+				// use rest of exploded tuple if present
+				while ( result.nextExpl < result.expls.size() ) {
+					const Alternative& actual = result.expls[result.nextExpl];
+					result.env.addActual( actual.env, result.openVars );
+					result.withArg( actual.expr );
+					++result.nextExpl;
+				}
+			}
+
 			while ( ! results.empty() ) {
 				// build combinations for all remaining arguments
@@ -852,5 +870,5 @@
 			// filter out results that don't use all the arguments
 			for ( ArgPack& result : results ) {
-				if ( result.nextArg >= args.size() ) {
+				if ( result.nextExpl >= result.expls.size() && result.nextArg >= args.size() ) {
 					finalResults.push_back( std::move(result) );
 				}
