Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision c2ce235057f98752b61e14874034b2d792b4f1b7)
+++ src/InitTweak/FixInit.cc	(revision 4ffdd638467baad09e66da0dfc9fb3e7dd4f9f5a)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Apr 26 14:57:13 2016
+// Last Modified On : Wed Apr 27 17:08:44 2016
 // Update Count     : 30
 //
@@ -216,7 +216,6 @@
 			if ( function->get_var()->get_linkage() != LinkageSpec::Intrinsic ) {
 				// replace argument to function call with temporary
-				arg = new VariableExpr( tmp );
+				arg = new CommaExpr( cpCtor, new VariableExpr( tmp ) );
 				impCpCtorExpr->get_tempDecls().push_back( tmp );
-				impCpCtorExpr->get_copyCtors().push_back( cpCtor );
 				impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) );
 			}
@@ -232,5 +231,5 @@
 		callExpr->set_env( impCpCtorExpr->get_env()->clone() );
 		for ( Type * result : appExpr->get_results() ) {
-			ObjectDecl * ret = new ObjectDecl( retNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result->clone(), new SingleInit( callExpr ) );
+			ObjectDecl * ret = new ObjectDecl( retNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result->clone(), 0 );
 			ret->get_type()->set_isConst( false );
 			impCpCtorExpr->get_returnDecls().push_back( ret );
@@ -249,5 +248,4 @@
 		assert( impCpCtorExpr );
 
-		std::list< Expression * > & copyCtors = impCpCtorExpr->get_copyCtors();
 		std::list< ObjectDecl * > & tempDecls = impCpCtorExpr->get_tempDecls();
 		std::list< ObjectDecl * > & returnDecls = impCpCtorExpr->get_returnDecls();
@@ -256,8 +254,8 @@
 		// add all temporary declarations and their constructors
 		for ( ObjectDecl * obj : tempDecls ) {
-			assert( ! copyCtors.empty() );
 			stmtsToAdd.push_back( new DeclStmt( noLabels, obj ) );
-			stmtsToAdd.push_back( new ExprStmt( noLabels, copyCtors.front() ) );
-			copyCtors.pop_front();
+		}
+		for ( ObjectDecl * obj : returnDecls ) {
+			stmtsToAdd.push_back( new DeclStmt( noLabels, obj ) );
 		}
 
@@ -274,5 +272,4 @@
 
 		// xxx - some of these aren't necessary, and can be removed once this is stable
-		copyCtors.clear();
 		dtors.clear();
 		tempDecls.clear();
@@ -282,10 +279,13 @@
 
 		if ( returnDecl ) {
-			// call is currently attached to first returnDecl
-			stmtsToAdd.push_back( new DeclStmt( noLabels, returnDecl ) );
-			return new VariableExpr( returnDecl );
+			UntypedExpr * assign = new UntypedExpr( new NameExpr( "?=?" ) );
+			assign->get_args().push_back( new VariableExpr( returnDecl ) );
+			assign->get_args().push_back( callExpr );
+			// know the result type of the assignment is the type of the LHS (minus the pointer), so
+			// add that onto the assignment expression so that later steps have the necessary information
+			assign->add_result( returnDecl->get_type()->clone() );
+			// return new CommaExpr( assign, new VariableExpr( returnDecl ) );
+			return assign;
 		} else {
-			// add call expression - if no return values, can call directly
-			assert( callExpr );
 			return callExpr;
 		}
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision c2ce235057f98752b61e14874034b2d792b4f1b7)
+++ src/SynTree/Expression.cc	(revision 4ffdd638467baad09e66da0dfc9fb3e7dd4f9f5a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Tue Apr 26 12:58:05 2016
+// Last Modified On : Wed Apr 27 17:07:19 2016
 // Update Count     : 40
 //
@@ -473,5 +473,4 @@
 
 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ) : Expression( other ), callExpr( maybeClone( other.callExpr ) ) {
-	cloneAll( other.copyCtors, copyCtors );
 	cloneAll( other.tempDecls, tempDecls );
 	cloneAll( other.returnDecls, returnDecls );
@@ -481,5 +480,4 @@
 ImplicitCopyCtorExpr::~ImplicitCopyCtorExpr() {
 	delete callExpr;
-	deleteAll( copyCtors );
 	deleteAll( tempDecls );
 	deleteAll( returnDecls );
@@ -493,6 +491,4 @@
 	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);
 	os << std::endl << std::string( indent, ' ' ) << "with return temporaries:" << std::endl;
 	printAll(returnDecls, os, indent+2);
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision c2ce235057f98752b61e14874034b2d792b4f1b7)
+++ src/SynTree/Expression.h	(revision 4ffdd638467baad09e66da0dfc9fb3e7dd4f9f5a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Apr 14 15:40:56 2016
+// Last Modified On : Wed Apr 27 17:06:49 2016
 // Update Count     : 21
 //
@@ -571,7 +571,4 @@
 	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; }
@@ -589,5 +586,4 @@
   private:
 	ApplicationExpr * callExpr;
-	std::list< Expression * > copyCtors;
 	std::list< ObjectDecl * > tempDecls;
 	std::list< ObjectDecl * > returnDecls;
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision c2ce235057f98752b61e14874034b2d792b4f1b7)
+++ src/SynTree/Mutator.cc	(revision 4ffdd638467baad09e66da0dfc9fb3e7dd4f9f5a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 18 17:29:55 2016
+// Last Modified On : Wed Apr 27 17:07:29 2016
 // Update Count     : 16
 //
@@ -339,5 +339,4 @@
 Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) {
 	impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) );
-	mutateAll( impCpCtorExpr->get_copyCtors(), *this );
 	mutateAll( impCpCtorExpr->get_tempDecls(), *this );
 	mutateAll( impCpCtorExpr->get_returnDecls(), *this );
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision c2ce235057f98752b61e14874034b2d792b4f1b7)
+++ src/SynTree/Visitor.cc	(revision 4ffdd638467baad09e66da0dfc9fb3e7dd4f9f5a)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 18 17:30:10 2016
+// Last Modified On : Wed Apr 27 17:07:40 2016
 // Update Count     : 18
 //
@@ -286,5 +286,4 @@
 void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) {
 	maybeAccept( impCpCtorExpr->get_callExpr(), *this );
-	acceptAll( impCpCtorExpr->get_copyCtors(), *this );
 	acceptAll( impCpCtorExpr->get_tempDecls(), *this );
 	acceptAll( impCpCtorExpr->get_returnDecls(), *this );
