Index: src/Tuples/Explode.h
===================================================================
--- src/Tuples/Explode.h	(revision bff227f73387fd7ed67a8a31545259b27d4ddc24)
+++ src/Tuples/Explode.h	(revision 6d267ca6bdc59bcd82cb15c2629c927f34392457)
@@ -30,5 +30,5 @@
 	template< typename OutputIterator >
 	void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign ) {
-		Type * res = expr->get_result();
+		Type * res = expr->get_result()->stripReferences();
 		if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
 			if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) {
@@ -38,6 +38,12 @@
 				}
 			} else {
-				// tuple type, but not tuple expr - recursively index into its components
+				// tuple type, but not tuple expr - recursively index into its components.
+				// if expr type is reference, convert to value type
 				Expression * arg = expr->clone();
+
+				if ( dynamic_cast<ReferenceType *>( arg->get_result() ) ) {
+					// TODO: does this go here (inside uniqueexpr) or outside uniqueexpr? I'm guessing probably should go after...
+					arg = new CastExpr( arg, tupleType->clone() );
+				}
 				if ( Tuples::maybeImpure( arg ) && ! dynamic_cast< UniqueExpr * >( arg ) ) {
 					// expressions which may contain side effects require a single unique instance of the expression.
