Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 9191a8e9707eadbd087b3ee1091decf80659e7b0)
+++ src/Common/utility.h	(revision 6d267ca6bdc59bcd82cb15c2629c927f34392457)
@@ -310,6 +310,6 @@
 template< typename T1, typename T2 >
 struct group_iterate_t {
-	group_iterate_t( const T1 & v1, const T2 & v2 ) : args(v1, v2) {
-		assertf(v1.size() == v2.size(), "group iteration requires containers of the same size.");
+	group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) {
+		assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%u, %u>.", v1.size(), v2.size());
 	};
 
@@ -336,7 +336,14 @@
 };
 
+/// performs bounds check to ensure that all arguments are of the same length.
 template< typename... Args >
 group_iterate_t<Args...> group_iterate( Args &&... args ) {
-	return group_iterate_t<Args...>(std::forward<Args>( args )...);
+	return group_iterate_t<Args...>(false, std::forward<Args>( args )...);
+}
+
+/// does not perform a bounds check - requires user to ensure that iteration terminates when appropriate.
+template< typename... Args >
+group_iterate_t<Args...> unsafe_group_iterate( Args &&... args ) {
+	return group_iterate_t<Args...>(true, std::forward<Args>( args )...);
 }
 
Index: src/Tuples/Explode.h
===================================================================
--- src/Tuples/Explode.h	(revision 9191a8e9707eadbd087b3ee1091decf80659e7b0)
+++ 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.
