Index: src/GenPoly/Lvalue.cpp
===================================================================
--- src/GenPoly/Lvalue.cpp	(revision 2ae845e9845e67527392a47ddfba7b330ce783b8)
+++ src/GenPoly/Lvalue.cpp	(revision 2325b576ab0aedd18a2818de030d95499f29479f)
@@ -316,8 +316,15 @@
 			Warning::RvalueToReferenceConversion, toCString( expr->arg ) );
 
+
+		// allowing conversion in the rvalue to const ref case
+		// use the referenced-to type to create temp variables
+		ast::Type const * targetType = dstType;
+		for (int i = 0; i < diff; ++i) targetType = (strict_dynamic_cast<ast::ReferenceType const *>(targetType))->base;
+
 		static UniqueName tmpNamer( "__ref_tmp_" );
 		ast::ObjectDecl * tmp = new ast::ObjectDecl( expr->arg->location,
 			tmpNamer.newName(),
-			ast::deepCopy( expr->arg->result ),
+			// ast::deepCopy( expr->arg->result ),
+			ast::deepCopy (targetType),
 			new ast::SingleInit( expr->arg->location, expr->arg ) );
 		PRINT( std::cerr << "make tmp: " << tmp << std::endl; )
Index: src/ResolvExpr/ConversionCost.cpp
===================================================================
--- src/ResolvExpr/ConversionCost.cpp	(revision 2ae845e9845e67527392a47ddfba7b330ce783b8)
+++ src/ResolvExpr/ConversionCost.cpp	(revision 2325b576ab0aedd18a2818de030d95499f29479f)
@@ -250,4 +250,24 @@
 			newSrc = new ast::BasicType( ast::BasicKind::UnsignedInt );
 		}
+		if (dstAsRef->base->is_const() ) {
+			auto cvtCost = conversionCost(newSrc, dstAsRef->base, srcIsLvalue, symtab, env) ;
+			if (cvtCost == Cost::zero) { // exact match, may use a lvalue src
+				if ( srcIsLvalue ) {
+					if ( src->qualifiers == dstAsRef->base->qualifiers ) {
+						return Cost::reference;
+					} else if ( src->qualifiers < dstAsRef->base->qualifiers ) {
+						return Cost::safe;
+					} else {
+						return Cost::unsafe;
+					}
+				}
+				else {
+					return Cost::reference;
+				}
+			}
+			else { // not exact match, conversion is needed so lvalueness of src does not matter
+				return cvtCost + Cost::reference;
+			}
+		}
 		if ( typesCompatibleIgnoreQualifiers( newSrc, dstAsRef->base, env ) ) {
 			if ( srcIsLvalue ) {
@@ -259,7 +279,5 @@
 					return Cost::unsafe;
 				}
-			} else if ( dstAsRef->base->is_const() ) {
-				return Cost::safe;
-			} else {
+			} else { // rvalue-to-NC-ref conversion
 				return Cost::unsafe;
 			}
