Index: src/Tuples/Explode.h
===================================================================
--- src/Tuples/Explode.h	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
+++ src/Tuples/Explode.h	(revision 432ce7ad4e4e7afac6fd4a1b330a48770f4cb0be)
@@ -19,9 +19,16 @@
 #include <utility>                      // for forward
 
+#include "AST/Expr.hpp"
 #include "ResolvExpr/Alternative.h"     // for Alternative, AltList
+#include "ResolvExpr/Candidate.hpp"     // for Candidate, CandidateList
 #include "ResolvExpr/ExplodedActual.h"  // for ExplodedActual
+#include "ResolvExpr/ExplodedArg.hpp"   // for ExplodedArg
 #include "SynTree/Expression.h"         // for Expression, UniqueExpr, AddressExpr
 #include "SynTree/Type.h"               // for TupleType, Type
 #include "Tuples.h"                     // for maybeImpure
+
+namespace ast {
+	class SymbolTable;
+}
 
 namespace SymTab {
@@ -130,4 +137,25 @@
 		explode( alts.begin(), alts.end(), indexer, std::forward<Output>(out), isTupleAssign );
 	}
+
+/// helper function used by explode
+template< typename Output >
+void explodeUnique( 
+	const ast::Expr * expr, const ResolvExpr::Candidate & arg, const ast::SymbolTable & symtab, 
+	Output && out, bool isTupleAssign
+) {
+	#warning unimplemented
+	(void)expr; (void)arg; (void)symtab; (void)out; (void)isTupleAssign;
+	assert(false);
+}
+
+/// expands a tuple-valued candidate into multiple candidates, each with a non-tuple type
+template< typename Output >
+void explode( 
+	const ResolvExpr::Candidate & arg, const ast::SymbolTable & symtab, Output && out, 
+	bool isTupleAssign = false
+) {
+	explodeUnique( arg.expr, arg, symtab, std::forward< Output >( out ), isTupleAssign );
+}
+
 } // namespace Tuples
 
Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
+++ src/Tuples/TupleAssignment.cc	(revision 432ce7ad4e4e7afac6fd4a1b330a48770f4cb0be)
@@ -377,4 +377,13 @@
 		}
 	}
+
+	void handleTupleAssignment( 
+		ResolvExpr::CandidateFinder & finder, const ast::UntypedExpr * assign, 
+		std::vector< ResolvExpr::CandidateFinder > & args
+	) {
+		#warning unimplmented
+		(void)finder; (void)assign; (void)args;
+		assert(false);
+	}
 } // namespace Tuples
 
Index: src/Tuples/Tuples.h
===================================================================
--- src/Tuples/Tuples.h	(revision 3ca912abaa01892790ebf2b72b458acd0b60d64d)
+++ src/Tuples/Tuples.h	(revision 432ce7ad4e4e7afac6fd4a1b330a48770f4cb0be)
@@ -26,4 +26,5 @@
 
 #include "ResolvExpr/AlternativeFinder.h"
+#include "ResolvExpr/CandidateFinder.hpp"
 
 namespace Tuples {
@@ -31,4 +32,7 @@
 	void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * assign,
 		std::vector< ResolvExpr::AlternativeFinder >& args );
+	void handleTupleAssignment( 
+		ResolvExpr::CandidateFinder & finder, const ast::UntypedExpr * assign, 
+		std::vector< ResolvExpr::CandidateFinder > & args );
 
 	// TupleExpansion.cc
