Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 17f22e78472d685cb5d6dd6dbebfb99c0f9ba439)
+++ src/ResolvExpr/ConversionCost.cc	(revision 8a6cf7efc5b53b47e66ba1a8f429bb5b7c181aa2)
@@ -248,13 +248,25 @@
 	void ConversionCost::visit(PointerType *pointerType) {
 		if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) {
-			if ( pointerType->get_base()->get_qualifiers() <= destAsPtr->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) {
-				cost = Cost::safe;
-			} else {  // xxx - this discards pointer qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?
+			// std::cerr << pointerType << " ===> " << destAsPtr;
+			Type::Qualifiers tq1 = pointerType->get_base()->get_qualifiers();
+			Type::Qualifiers tq2 = destAsPtr->get_base()->get_qualifiers();
+			if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) {
+				if ( tq1 == tq2 ) {
+					// types are the same
+					cost = Cost::zero;
+				} else {
+					// types are the same, except otherPointer has more qualifiers
+					// std::cerr << " :: compatible and good qualifiers" << std::endl;
+					cost = Cost::safe;
+				}
+			} else {  // xxx - this discards qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?
 				int assignResult = ptrsAssignable( pointerType->get_base(), destAsPtr->get_base(), env );
-				if ( assignResult < 0 ) {
+				// std::cerr << " :: " << assignResult << std::endl;
+				if ( assignResult < 0 && pointerType->get_base()->get_qualifiers() <= destAsPtr->get_qualifiers() ) {
 					cost = Cost::safe;
 				} else if ( assignResult > 0 ) {
 					cost = Cost::unsafe;
 				} // if
+				// assignResult == 0 means Cost::Infinity
 			} // if
 		} else if ( dynamic_cast< ZeroType* >( dest ) != nullptr || dynamic_cast< OneType* >( dest ) != nullptr ) {
@@ -272,5 +284,12 @@
 		// cv can be safely dropped because of 'implicit dereference' behavior.
 		refType->get_base()->accept( *this );
-		cost.incReference();
+		if ( refType->get_base()->get_qualifiers() == dest->get_qualifiers() ) {
+			cost.incReference();  // prefer exact qualifiers
+		} else if ( refType->get_base()->get_qualifiers() < dest->get_qualifiers() ) {
+			cost.incSafe(); // then gaining qualifiers
+		} else {
+			cost.incUnsafe(); // lose qualifiers as last resort
+		}
+		// std::cerr << refType << " ==> " << dest << " " << cost << std::endl;
 	}
 
