Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/Expression.h	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -634,12 +634,28 @@
 };
 
+/// UntypedTupleExpr represents a tuple expression ( [a, b, c] ) before resolution
+class UntypedTupleExpr : public Expression {
+  public:
+	UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
+	UntypedTupleExpr( const UntypedTupleExpr &other );
+	virtual ~UntypedTupleExpr();
+
+	std::list<Expression*>& get_exprs() { return exprs; }
+
+	virtual UntypedTupleExpr *clone() const { return new UntypedTupleExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	std::list<Expression*> exprs;
+};
+
 /// TupleExpr represents a tuple expression ( [a, b, c] )
 class TupleExpr : public Expression {
   public:
-	TupleExpr( const std::list< Expression * > & exprs = std::list< Expression * >(), Expression *_aname = nullptr );
+	TupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
 	TupleExpr( const TupleExpr &other );
 	virtual ~TupleExpr();
 
-	void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }
 	std::list<Expression*>& get_exprs() { return exprs; }
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/Mutator.cc	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -345,4 +345,5 @@
 Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) {
 	impCpCtorExpr->set_env( maybeMutate( impCpCtorExpr->get_env(), *this ) );
+	impCpCtorExpr->set_result( maybeMutate( impCpCtorExpr->get_result(), *this ) );
 	impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) );
 	mutateAll( impCpCtorExpr->get_tempDecls(), *this );
@@ -378,4 +379,11 @@
 	rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) );
 	return rangeExpr;
+}
+
+Expression *Mutator::mutate( UntypedTupleExpr *tupleExpr ) {
+	tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) );
+	tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
+	mutateAll( tupleExpr->get_exprs(), *this );
+	return tupleExpr;
 }
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/Mutator.h	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -78,4 +78,5 @@
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
 	virtual Expression* mutate( RangeExpr *rangeExpr );
+	virtual Expression* mutate( UntypedTupleExpr *tupleExpr );
 	virtual Expression* mutate( TupleExpr *tupleExpr );
 	virtual Expression* mutate( TupleIndexExpr *tupleExpr );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/SynTree.h	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -83,4 +83,5 @@
 class UntypedValofExpr;
 class RangeExpr;
+class UntypedTupleExpr;
 class TupleExpr;
 class TupleIndexExpr;
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/TupleExpr.cc	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -21,10 +21,23 @@
 #include "VarExprReplacer.h"
 
+UntypedTupleExpr::UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) {
+}
+
+UntypedTupleExpr::UntypedTupleExpr( const UntypedTupleExpr &other ) : Expression( other ) {
+	cloneAll( other.exprs, exprs );
+}
+
+UntypedTupleExpr::~UntypedTupleExpr() {
+	deleteAll( exprs );
+}
+
+void UntypedTupleExpr::print( std::ostream &os, int indent ) const {
+	os << "Untyped Tuple:" << std::endl;
+	printAll( exprs, os, indent+2 );
+	Expression::print( os, indent );
+}
+
 TupleExpr::TupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) {
-	if ( ! exprs.empty() ) {
-		if ( std::all_of( exprs.begin(), exprs.end(), [](Expression * expr) { return expr->get_result(); } ) ) {
-			set_result( Tuples::makeTupleType( exprs ) );
-		}
-	}
+	set_result( Tuples::makeTupleType( exprs ) );
 }
 
@@ -45,5 +58,5 @@
 TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index )  {
 	TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() );
-	assert( type->size() > index );
+	assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d", type->size(), index );
 	set_result( (*std::next( type->get_types().begin(), index ))->clone() );
 	get_result()->set_isLvalue( type->get_isLvalue() );
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/Visitor.cc	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -273,4 +273,5 @@
 
 void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) {
+	maybeAccept( impCpCtorExpr->get_result(), *this );
 	maybeAccept( impCpCtorExpr->get_callExpr(), *this );
 	acceptAll( impCpCtorExpr->get_tempDecls(), *this );
@@ -298,4 +299,9 @@
 	maybeAccept( rangeExpr->get_low(), *this );
 	maybeAccept( rangeExpr->get_high(), *this );
+}
+
+void Visitor::visit( UntypedTupleExpr *tupleExpr ) {
+	maybeAccept( tupleExpr->get_result(), *this );
+	acceptAll( tupleExpr->get_exprs(), *this );
 }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision e33f3213eb817855f65c2c1a3a7e12bdcc2831e5)
+++ src/SynTree/Visitor.h	(revision 4c8621ac0673e269714072f2f0e355df9f6462de)
@@ -78,4 +78,5 @@
 	virtual void visit( UntypedValofExpr *valofExpr );
 	virtual void visit( RangeExpr *rangeExpr );
+	virtual void visit( UntypedTupleExpr *tupleExpr );
 	virtual void visit( TupleExpr *tupleExpr );
 	virtual void visit( TupleIndexExpr *tupleExpr );
