Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 0b5d8710a6dbc15de5d91976d128755d05fc1f7d)
+++ src/Tuples/TupleAssignment.cc	(revision 5fb68301d498ada1460cdc13b877a761bc05cd1c)
@@ -182,11 +182,7 @@
 
 		ResolvExpr::Alternative lhsAlt = alts.front();
-		// peel off the cast that exists on ctor/dtor expressions
-		bool isCast = false;
-		if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( lhsAlt.expr ) ) {
-			lhsAlt.expr = castExpr->get_arg();
-			castExpr->set_arg( nullptr );
-			delete castExpr;
-			isCast = true;
+		// explode is aware of casts - ensure every LHS expression is sent into explode with a reference cast
+		if ( ! dynamic_cast< CastExpr * >( lhsAlt.expr ) ) {
+			lhsAlt.expr = new CastExpr( lhsAlt.expr, new ReferenceType( Type::Qualifiers(), lhsAlt.expr->get_result()->clone() ) );
 		}
 
@@ -194,17 +190,6 @@
 		explode( lhsAlt, spotter.currentFinder.get_indexer(), back_inserter(lhs), true );
 
-		// and finally, re-add the cast to each lhs expr, so that qualified tuple fields can be constructed
-		if ( isCast ) {
-			for ( ResolvExpr::Alternative & alt : lhs ) {
-				Expression *& expr = alt.expr;
-				Type * type = expr->get_result()->clone();
-				type->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
-				expr = new CastExpr( expr, new ReferenceType( Type::Qualifiers(), type ) );
-			}
-		}
-
 		for ( ResolvExpr::Alternative & alt : lhs ) {
 			// every LHS value must be a reference - some come in with a cast expression, if it doesn't just cast to reference here.
-			// TODO: can this somehow be merge with the cast code directly above?
 			if ( ! dynamic_cast< ReferenceType * >( alt.expr->get_result() ) ) {
 				alt.expr = new CastExpr( alt.expr, new ReferenceType( Type::Qualifiers(), alt.expr->get_result()->clone() ) );
