Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision e1f7eefc84701acc2af857cd1c484e5650e81cba)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 0c13238b5b884bbd89f602258bdd1d13c4600011)
@@ -474,8 +474,11 @@
 		}
 
-		// mark specialization cost of return types
-		for ( DeclarationWithType* returnVal : function->returnVals ) {
-			convCost.decSpec( specCost( returnVal->get_type() ) );
-		}
+		// specialization cost of return types can't be accounted for directly, it disables 
+		// otherwise-identical calls, like this example based on auto-newline in the I/O lib:
+		//
+		//   forall(otype OS) {
+		//     void ?|?(OS&, int);  // with newline
+		//     OS&  ?|?(OS&, int);  // no newline, always chosen due to more specialization
+		//   }
 
 		// mark type variable and specialization cost of forall clause
@@ -483,9 +486,4 @@
 		for ( TypeDecl* td : function->forall ) {
 			convCost.decSpec( td->assertions.size() );
-		}
-
-		// xxx -- replace with new costs in resolver
-		for ( InferredParams::const_iterator assert = appExpr->inferParams.begin(); assert != appExpr->inferParams.end(); ++assert ) {
-			convCost += computeConversionCost( assert->second.actualType, assert->second.formalType, indexer, alt.env );
 		}
 
@@ -1229,5 +1227,5 @@
 				Alternative newAlt{ 
 					restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ), 
-					alt.env, openVars, needAssertions, alt.cost + thisCost, thisCost };
+					alt.env, openVars, needAssertions, alt.cost, alt.cost + thisCost };
 				inferParameters( newAlt, back_inserter( candidates ) );
 			} // if
