Index: src/ResolvExpr/CastCost.cc
===================================================================
--- src/ResolvExpr/CastCost.cc	(revision 6ccfb7f9f9c463a6fd8872ec02bb9b490d41cbd1)
+++ src/ResolvExpr/CastCost.cc	(revision 0c6596fab97091b4f0cf23a9d6e3d78a29ab00f3)
@@ -58,5 +58,7 @@
 			return Cost::safe;
 		} else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) {
-			return convertToReferenceCost( src, refType, indexer, env );
+			return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const TypeEnvironment & env, const SymTab::Indexer & indexer) {
+				return ptrsCastable( t1, t2, env, indexer );
+			});
 		} else {
 			CastCost converter( dest, indexer, env );
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 6ccfb7f9f9c463a6fd8872ec02bb9b490d41cbd1)
+++ src/ResolvExpr/ConversionCost.cc	(revision 0c6596fab97091b4f0cf23a9d6e3d78a29ab00f3)
@@ -40,5 +40,4 @@
 #define PRINT(x)
 #endif
-
 	Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {
 		if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) {
@@ -78,5 +77,7 @@
 		} else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) {
 			PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; )
-			return convertToReferenceCost( src, refType, indexer, env );
+			return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const TypeEnvironment & env, const SymTab::Indexer &){
+				return ptrsAssignable( t1, t2, env );
+			});
 		} else {
 			ConversionCost converter( dest, indexer, env );
@@ -90,14 +91,14 @@
 	}
 
-	Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {
+	Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) {
 		PRINT( std::cerr << "convert to reference cost..." << std::endl; )
 		if ( diff > 0 ) {
 			// TODO: document this
-			Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env );
+			Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env, func );
 			cost.incReference();
 			return cost;
 		} else if ( diff < -1 ) {
 			// TODO: document this
-			Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env );
+			Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env, func );
 			cost.incReference();
 			return cost;
@@ -110,5 +111,5 @@
 					return Cost::safe;
 				} else {  // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?
-					int assignResult = ptrsAssignable( srcAsRef->get_base(), destAsRef->get_base(), env );
+					int assignResult = func( srcAsRef->get_base(), destAsRef->get_base(), env, indexer );
 					PRINT( std::cerr << "comparing references: " << assignResult << " " << srcAsRef << " " << destAsRef << std::endl; )
 					if ( assignResult < 0 ) {
@@ -157,7 +158,7 @@
 	}
 
-	Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {
+	Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) {
 		int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth();
-		return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env );
+		return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env, func );
 	}
 
Index: src/ResolvExpr/ConversionCost.h
===================================================================
--- src/ResolvExpr/ConversionCost.h	(revision 6ccfb7f9f9c463a6fd8872ec02bb9b490d41cbd1)
+++ src/ResolvExpr/ConversionCost.h	(revision 0c6596fab97091b4f0cf23a9d6e3d78a29ab00f3)
@@ -16,4 +16,6 @@
 #pragma once
 
+#include <functional>         // for function
+
 #include "Cost.h"             // for Cost
 #include "SynTree/Visitor.h"  // for Visitor
@@ -21,9 +23,9 @@
 
 namespace SymTab {
-class Indexer;
+	class Indexer;
 }  // namespace SymTab
 
 namespace ResolvExpr {
-class TypeEnvironment;
+	class TypeEnvironment;
 
 	class ConversionCost : public Visitor {
@@ -55,5 +57,6 @@
 	};
 
-	Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env );
+	typedef std::function<int(Type *, Type *, const TypeEnvironment &, const SymTab::Indexer &)> PtrsFunction;
+	Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func );
 } // namespace ResolvExpr
 
