Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 23b6643f5ea88fa1b0e11583e2f0ed9315a515de)
+++ src/ResolvExpr/Alternative.h	(revision 65660bd065cbc0b68c92db2425b5984d675dff58)
@@ -45,45 +45,4 @@
 		TypeEnvironment env;
 	};
-
-	/// helper function used by explode
-	template< typename OutputIterator >
-	void explodeUnique( Expression * expr, const Alternative & alt, OutputIterator out ) {
-		Type * res = expr->get_result();
-		if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
-			if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) {
-				// can open tuple expr and dump its exploded components
-				for ( Expression * expr : tupleExpr->get_exprs() ) {
-					explodeUnique( expr, alt, out );
-				}
-			} else {
-				// tuple type, but not tuple expr - need to refer to single instance of the argument
-				// expression and index into its components
-				UniqueExpr * unq = new UniqueExpr( expr->clone() );
-				for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
-					TupleIndexExpr * idx = new TupleIndexExpr( unq->clone(), i );
-					explodeUnique( idx, alt, out );
-					delete idx;
-				}
-				delete unq;
-			}
-		} else {
-			// atomic (non-tuple) type - output a clone of the expression in a new alternative
-			*out++ = Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost );
-		}
-	}
-
-	/// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
-	template< typename OutputIterator >
-	void explode( const Alternative &alt, OutputIterator out ) {
-		explodeUnique( alt.expr, alt, out );
-	}
-
-	// explode list of alternatives
-	template< typename OutputIterator >
-	void explode( const AltList & alts, OutputIterator out ) {
-		for ( const Alternative & alt : alts ) {
-			explode( alt, out );
-		}
-	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 23b6643f5ea88fa1b0e11583e2f0ed9315a515de)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 65660bd065cbc0b68c92db2425b5984d675dff58)
@@ -435,5 +435,5 @@
 		// flatten actuals so that each actual has an atomic (non-tuple) type
 		AltList exploded;
-		explode( actuals, back_inserter( exploded ) );
+		Tuples::explode( actuals, back_inserter( exploded ) );
 
 		AltList::iterator actualExpr = exploded.begin();
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 23b6643f5ea88fa1b0e11583e2f0ed9315a515de)
+++ src/ResolvExpr/Resolver.cc	(revision 65660bd065cbc0b68c92db2425b5984d675dff58)
@@ -38,5 +38,5 @@
 
 		virtual void visit( FunctionDecl *functionDecl );
-		virtual void visit( ObjectDecl *functionDecl );
+		virtual void visit( ObjectDecl *objectDecl );
 		virtual void visit( TypeDecl *typeDecl );
 		virtual void visit( EnumDecl * enumDecl );
@@ -442,4 +442,10 @@
 				(*iter)->accept( *this );
 			} // for
+		} else if ( TupleType * tt = dynamic_cast< TupleType * > ( initContext ) ) {
+			for ( Type * t : *tt ) {
+				if ( iter == end ) break;
+				initContext = t;
+				(*iter++)->accept( *this );
+			}
 		} else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) {
 			resolveAggrInit( st->get_baseStruct(), iter, end );
