Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Expression.cc	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed Dec 09 14:10:29 2015
+// Last Modified On : Thu Apr 14 13:02:28 2016
 // Update Count     : 34
 //
@@ -78,4 +78,6 @@
 
 VariableExpr::VariableExpr( DeclarationWithType *_var, Expression *_aname ) : Expression( _aname ), var( _var ) {
+	assert( var );
+	assert( var->get_type() );
 	add_result( var->get_type()->clone() );
 	for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) {
@@ -432,4 +434,37 @@
 }
 
+
+ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( ApplicationExpr * callExpr ) : callExpr( callExpr ) {
+	assert( callExpr );
+	cloneAll( callExpr->get_results(), results );
+}
+
+ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ) : Expression( other ), callExpr( maybeClone( other.callExpr ) ) {
+	cloneAll( other.results, results );
+	cloneAll( other.copyCtors, copyCtors );
+	cloneAll( other.tempDecls, tempDecls );
+	cloneAll( other.returnDecls, returnDecls );
+	cloneAll( other.dtors, dtors );
+}
+
+ImplicitCopyCtorExpr::~ImplicitCopyCtorExpr() {
+	delete callExpr;
+	deleteAll( copyCtors );
+	deleteAll( tempDecls );
+	deleteAll( returnDecls );
+	deleteAll( dtors );
+}
+
+void ImplicitCopyCtorExpr::print( std::ostream &os, int indent ) const {
+	os << std::string( indent, ' ' ) <<  "Implicit Copy Constructor Expression: " << std::endl;
+	assert( callExpr );
+	callExpr->print( os, indent + 2 );
+	os << std::endl << std::string( indent, ' ' ) << "with temporaries:" << std::endl;
+	printAll(tempDecls, os, indent+2);
+	os << std::endl << std::string( indent, ' ' ) << "with copyCtors:" << std::endl;
+	printAll(copyCtors, os, indent+2);
+	Expression::print( os, indent );
+}
+
 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {}
 
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Expression.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Wed Dec 09 14:10:21 2015
+// Last Modified On : Thu Apr 14 12:04:58 2016
 // Update Count     : 19
 //
@@ -22,4 +22,5 @@
 #include "Mutator.h"
 #include "Constant.h"
+#include "Common/UniqueName.h"
 
 /// Expression is the root type for all expressions
@@ -539,4 +540,39 @@
 };
 
+/// ImplicitCopyCtorExpr represents the application of a function to a set of parameters,
+/// along with a set of copy constructor calls, one for each argument.
+class ImplicitCopyCtorExpr : public Expression {
+public:
+	ImplicitCopyCtorExpr( ApplicationExpr * callExpr );
+	ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other );
+	virtual ~ImplicitCopyCtorExpr();
+
+	ApplicationExpr *get_callExpr() const { return callExpr; }
+	void set_callExpr( ApplicationExpr *newValue ) { callExpr = newValue; }
+
+	std::list< Expression * > & get_copyCtors() { return copyCtors; }
+	void set_copyCtors( std::list< Expression * > newValue ) { copyCtors = newValue; }
+
+	std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; }
+	void set_tempDecls( std::list< ObjectDecl * > newValue ) { tempDecls = newValue; }
+
+	std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; }
+	void set_returnDecls( std::list< ObjectDecl * > newValue ) { returnDecls = newValue; }
+
+	std::list< Expression * > & get_dtors() { return dtors; }
+	void set_dtors( std::list< Expression * > newValue ) { dtors = newValue; }
+
+	virtual ImplicitCopyCtorExpr *clone() const { return new ImplicitCopyCtorExpr( *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:
+	ApplicationExpr * callExpr;
+	std::list< Expression * > copyCtors;
+	std::list< ObjectDecl * > tempDecls;
+	std::list< ObjectDecl * > returnDecls;
+	std::list< Expression * > dtors;
+};
+
 /// ValofExpr represents a GCC 'lambda expression'
 class UntypedValofExpr : public Expression {
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Initializer.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 11 17:35:30 2016
+// Last Modified On : Tue Apr 12 13:49:13 2016
 // Update Count     : 19
 //
@@ -58,5 +58,5 @@
 class SingleInit : public Initializer {
   public:
-	SingleInit( Expression *value, const std::list< Expression *> &designators, bool maybeConstructed = false );
+	SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
 	SingleInit( const SingleInit &other );
 	virtual ~SingleInit();
@@ -83,5 +83,5 @@
   public:
 	ListInit( const std::list<Initializer*> &initializers,
-			  const std::list<Expression *> &designators, bool maybeConstructed = false );
+			  const std::list<Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
 	virtual ~ListInit();
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Mutator.cc	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 04 17:14:20 2016
+// Last Modified On : Fri Apr 08 14:01:47 2016
 // Update Count     : 15
 //
@@ -331,4 +331,11 @@
 }
 
+Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) {
+	impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) );
+	mutateAll( impCpCtorExpr->get_copyCtors(), *this );
+	mutateAll( impCpCtorExpr->get_tempDecls(), *this );
+	return impCpCtorExpr;
+}
+
 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) {
 	mutateAll( valofExpr->get_results(), *this );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Mutator.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 04 17:14:44 2016
+// Last Modified On : Fri Apr 08 13:22:04 2016
 // Update Count     : 9
 //
@@ -75,4 +75,5 @@
 	virtual Expression* mutate( TypeExpr *typeExpr );
 	virtual Expression* mutate( AsmExpr *asmExpr );
+	virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr );
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
 
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/SynTree.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 04 17:16:09 2016
+// Last Modified On : Fri Apr 08 13:49:47 2016
 // Update Count     : 4
 //
@@ -80,4 +80,5 @@
 class TypeExpr;
 class AsmExpr;
+class ImplicitCopyCtorExpr;
 class UntypedValofExpr;
 
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Visitor.cc	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 04 17:16:25 2016
+// Last Modified On : Fri Apr 08 13:53:21 2016
 // Update Count     : 18
 //
@@ -279,4 +279,10 @@
 }
 
+void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) {
+	maybeAccept( impCpCtorExpr->get_callExpr(), *this );
+	acceptAll( impCpCtorExpr->get_copyCtors(), *this );
+	acceptAll( impCpCtorExpr->get_tempDecls(), *this );
+}
+
 void Visitor::visit( UntypedValofExpr *valofExpr ) {
 	acceptAll( valofExpr->get_results(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 7a69460b3cf464e4f2984c2a443c935a47ab9b44)
+++ src/SynTree/Visitor.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 04 17:16:36 2016
+// Last Modified On : Fri Apr 08 13:26:31 2016
 // Update Count     : 6
 //
@@ -75,4 +75,5 @@
 	virtual void visit( TypeExpr *typeExpr );
 	virtual void visit( AsmExpr *asmExpr );
+	virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr );
 	virtual void visit( UntypedValofExpr *valofExpr );
 
