Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 4f68f6dbbf6cb8fc2136ecc466957b4498ccb3aa)
+++ src/Tuples/TupleAssignment.cc	(revision d20a3438750cae4921b6136971494220a78c44ca)
@@ -318,4 +318,6 @@
 		assert( (! lhs.empty() && rhs.size() <= 1) || (lhs.empty() && rhs.empty()) );
 
+		// xxx - may need to split this up into multiple declarations, because potential conversion to references
+		//  probably should not reference local variable - see MultipleAssignMatcher::match
 		ObjectDecl * rtmp = rhs.size() == 1 ? newObject( rhsNamer, rhs.front().expr ) : nullptr;
 		for ( ResolvExpr::Alternative & lhsAlt : lhs ) {
@@ -336,11 +338,16 @@
 			std::list< ObjectDecl * > ltmp;
 			std::list< ObjectDecl * > rtmp;
-			std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), [&]( ResolvExpr::Alternative & alt ){
-				return newObject( lhsNamer, alt.expr );
-			});
-			std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), [&]( ResolvExpr::Alternative & alt ){
-				return newObject( rhsNamer, alt.expr );
-			});
-			zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), [&](ObjectDecl * obj1, ObjectDecl * obj2 ) { return createFunc(spotter.fname, obj1, obj2); } );
+			for ( auto p : group_iterate( lhs, rhs ) ) {
+				ResolvExpr::Alternative & lhsAlt = std::get<0>(p);
+				ResolvExpr::Alternative & rhsAlt = std::get<1>(p);
+				// convert RHS to LHS type minus one reference -- important for the case where LHS is && and RHS is lvalue, etc.
+				ReferenceType * lhsType = strict_dynamic_cast<ReferenceType *>( lhsAlt.expr->result );
+				rhsAlt.expr = new CastExpr( rhsAlt.expr, lhsType->base->clone() );
+				ObjectDecl * lobj = newObject( lhsNamer, lhsAlt.expr );
+				ObjectDecl * robj = newObject( rhsNamer, rhsAlt.expr );
+				out.push_back( createFunc(spotter.fname, lobj, robj) );
+				ltmp.push_back( lobj );
+				rtmp.push_back( robj );
+			}
 			tmpDecls.splice( tmpDecls.end(), ltmp );
 			tmpDecls.splice( tmpDecls.end(), rtmp );
