Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision bff227f73387fd7ed67a8a31545259b27d4ddc24)
+++ src/GenPoly/Lvalue.cc	(revision 9191a8e9707eadbd087b3ee1091decf80659e7b0)
@@ -241,19 +241,17 @@
 			} else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( castExpr->get_arg()->get_result() ) ) {
 				// conversion from reference to rvalue
-				// should be easy, just need to move deref code up here?
 				PRINT( std::cerr << "convert reference to rvalue -- *" << std::endl; )
-				if ( isIntrinsicReference( castExpr->get_arg() ) ) {
-					PRINT( std::cerr << "but arg is intrinsic reference -- nop" << std::endl; )
-					return castExpr;
-				}
 				PRINT( std::cerr << "was = " << castExpr << std::endl; )
-
-				Expression * deref = mkDeref( castExpr->get_arg() );
-				deref->set_env( castExpr->get_env() );
+				Expression * ret = castExpr->get_arg();
+				if ( ! isIntrinsicReference( ret ) ) {
+					// dereference if not already dereferenced
+					ret = mkDeref( ret );
+				}
+				ret->set_env( castExpr->get_env() );
 				castExpr->set_arg( nullptr );
 				castExpr->set_env( nullptr );
 				delete castExpr;
-				PRINT( std::cerr << "now: " << deref << std::endl; )
-				return deref;
+				PRINT( std::cerr << "now: " << ret << std::endl; )
+				return ret;
 			}
 			return castExpr;
