Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 5fb68301d498ada1460cdc13b877a761bc05cd1c)
+++ src/GenPoly/Lvalue.cc	(revision fc56cdbf036d8e5a6b7f729bba6c22479005dd12)
@@ -119,5 +119,4 @@
 
 	void convertLvalue( std::list< Declaration* >& translationUnit ) {
-		std::cerr << "convertLvalue" << std::endl;
 		PassVisitor<ReferenceConversions> refCvt;
 		PassVisitor<ReferenceTypeElimination> elim;
@@ -300,4 +299,37 @@
 					int depth1 = refType->referenceDepth();
 					int depth2 = otherRef->referenceDepth();
+					int diff = depth1-depth2;
+					if ( diff == 0 ) {
+						assertf( depth1 == depth2, "non-intrinsic reference with cast of reference to reference not yet supported: %d %d %s", depth1, depth2, toString( castExpr ).c_str() );
+						PRINT( std::cerr << castExpr << std::endl; )
+						return castExpr;
+					} else if ( diff < 0 ) {
+						Expression * ret = castExpr->get_arg();
+						for ( int i = 0; i < diff; ++i ) {
+							ret = mkDeref( ret );
+						}
+						ret->set_env( castExpr->get_env() );
+						delete ret->get_result();
+						ret->set_result( castExpr->get_result() );
+						castExpr->set_env( nullptr );
+						castExpr->set_arg( nullptr );
+						castExpr->set_result( nullptr );
+						delete castExpr;
+						return ret;
+					} else if ( diff > 0 ) {
+						Expression * ret = castExpr->get_arg();
+						for ( int i = 0; i < diff; ++i ) {
+							ret = new AddressExpr( ret );
+						}
+						ret->set_env( castExpr->get_env() );
+						delete ret->get_result();
+						ret->set_result( castExpr->get_result() );
+						castExpr->set_env( nullptr );
+						castExpr->set_arg( nullptr );
+						castExpr->set_result( nullptr );
+						delete castExpr;
+						return ret;
+					}
+
 					assertf( depth1 == depth2, "non-intrinsic reference with cast of reference to reference not yet supported: %d %d %s", depth1, depth2, toString( castExpr ).c_str() );
 					PRINT( std::cerr << castExpr << std::endl; )
