Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision 6e027d61b848988e72496c09044d2767a30b666d)
+++ src/ResolvExpr/CommonType.cc	(revision 74cdfb1cc402405e93d3bb654795b6909567dfe5)
@@ -91,13 +91,21 @@
 			// special case where one type has a reference depth of 1 larger than the other
 			if ( diff > 0 || diff < 0 ) {
+				// std::cerr << "reference depth diff: " << diff << std::endl;
 				Type * result = nullptr;
-				if ( ReferenceType * ref1 = dynamic_cast< ReferenceType * >( type1 ) ) {
+				ReferenceType * ref1 = dynamic_cast< ReferenceType * >( type1 );
+				ReferenceType * ref2 = dynamic_cast< ReferenceType * >( type2 );
+				if ( diff > 0 ) {
+					// deeper on the left
+					assert( ref1 );
+					result = handleReference( ref1->base, type2, widenFirst, widenSecond, indexer, env, openVars );
+				} else {
+					// deeper on the right
+					assert( ref2 );
+					result = handleReference( type1, ref2->base, widenFirst, widenSecond, indexer, env, openVars );
+				}
+				if ( result && ref1 ) {
 					// formal is reference, so result should be reference
-					result = handleReference( ref1->base, type2, widenFirst, widenSecond, indexer, env, openVars );
-					if ( result ) result = new ReferenceType( ref1->get_qualifiers(), result );
-				} else {
-					// formal is value, so result should be value
-					ReferenceType * ref2 = strict_dynamic_cast< ReferenceType * > ( type2 );
-					result = handleReference( type1, ref2->base, widenFirst, widenSecond, indexer, env, openVars );
+					// std::cerr << "formal is reference; result should be reference" << std::endl;
+					result = new ReferenceType( ref1->get_qualifiers(), result );
 				}
 				// std::cerr << "common type of reference [" << type1 << "] and [" << type2 << "] is [" << result << "]" << std::endl;
