Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision edbdbe65648d9874b8a2388ecb862f7a06e38f4a)
+++ src/InitTweak/FixInit.cc	(revision 65aca88c360c68fb3e17eb3a984a3727a769f630)
@@ -619,5 +619,15 @@
 
 		Expression * FixCopyCtors::mutate( StmtExpr * stmtExpr ) {
-			stmtExpr = safe_dynamic_cast< StmtExpr * >( Parent::mutate( stmtExpr ) );
+			// function call temporaries should be placed at statement-level, rather than nested inside of a new statement expression,
+			// since temporaries can be shared across sub-expressions, e.g.
+			//   [A, A] f();
+			//   g([A] x, [A] y);
+			//   f(g());
+			// f is executed once, so the return temporary is shared across the tuple constructors for x and y.
+			std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids();
+			for ( Statement *& stmt : stmts ) {
+				stmt = stmt->acceptMutator( *this );
+			} // for
+			// stmtExpr = safe_dynamic_cast< StmtExpr * >( Parent::mutate( stmtExpr ) );
 			assert( stmtExpr->get_result() );
 			Type * result = stmtExpr->get_result();
