Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 207c7e1ddfd88d45fb9f62e00f173daf5b443541)
+++ src/InitTweak/FixInit.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
@@ -21,4 +21,5 @@
 #include <unordered_set>
 #include "InitTweak.h"
+#include "GenInit.h"
 #include "FixInit.h"
 #include "FixGlobalInit.h"
@@ -86,9 +87,8 @@
 			/// create and resolve ctor/dtor expression: fname(var, [cpArg])
 			Expression * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL );
-			Expression * makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL );
 			/// true if type does not need to be copy constructed to ensure correctness
 			bool skipCopyConstruct( Type * type );
 			void copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr * impCpCtorExpr );
-			void destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr );
+			void destructRet( ObjectDecl * ret, ImplicitCopyCtorExpr * impCpCtorExpr );
 
 			TypeSubstitution * env;
@@ -398,12 +398,8 @@
 		Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {
 			assert( var );
-			return makeCtorDtor( fname, new AddressExpr( new VariableExpr( var ) ), cpArg );
-		}
-
-		Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) {
-			assert( thisArg );
-			UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) );
-			untyped->get_args().push_back( thisArg );
-			if (cpArg) untyped->get_args().push_back( cpArg->clone() );
+			// arrays are not copy constructed, so this should always be an ExprStmt
+			ImplicitCtorDtorStmt * stmt = genCtorDtor( fname, var, cpArg );
+			ExprStmt * exprStmt = safe_dynamic_cast< ExprStmt * >( stmt->get_callStmt() );
+			Expression * untyped = exprStmt->get_expr();
 
 			// resolve copy constructor
@@ -420,5 +416,5 @@
 			} // if
 
-			delete untyped;
+			delete stmt;
 			return resolved;
 		}
@@ -456,6 +452,6 @@
 		}
 
-		void ResolveCopyCtors::destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) {
-			impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( ret ) ) );
+		void ResolveCopyCtors::destructRet( ObjectDecl * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) {
+			impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) );
 		}
 
@@ -487,5 +483,5 @@
 				if ( ! result->get_isLvalue() ) {
 					// destructing lvalue returns is bad because it can cause multiple destructor calls to the same object - the returned object is not a temporary
-					destructRet( new VariableExpr( ret ), impCpCtorExpr );
+					destructRet( ret, impCpCtorExpr );
 				}
 			} // for
@@ -515,5 +511,5 @@
 				last->set_expr( makeCtorDtor( "?{}", ret, last->get_expr() ) );
 
-				stmtExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( new VariableExpr( ret ) ) ) );
+				stmtExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) );
 			} // if
 
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 207c7e1ddfd88d45fb9f62e00f173daf5b443541)
+++ src/InitTweak/GenInit.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
@@ -247,4 +247,14 @@
 			managedTypes.insert( SymTab::Mangler::mangle( type->get_base() ) );
 		}
+	}
+
+	ImplicitCtorDtorStmt * genCtorDtor( const std::string & fname, ObjectDecl * objDecl, Expression * arg ) {
+		// call into genImplicitCall from Autogen.h to generate calls to ctor/dtor
+		assertf( objDecl, "genCtorDtor passed null objDecl" );
+		std::list< Statement * > stmts;
+		InitExpander srcParam( maybeClone( arg ) );
+		SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), fname, back_inserter( stmts ), objDecl );
+		assert( stmts.size() <= 1 );
+		return stmts.size() == 1 ? safe_dynamic_cast< ImplicitCtorDtorStmt * >( stmts.front() ) : nullptr;
 	}
 
Index: src/InitTweak/GenInit.h
===================================================================
--- src/InitTweak/GenInit.h	(revision 207c7e1ddfd88d45fb9f62e00f173daf5b443541)
+++ src/InitTweak/GenInit.h	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
@@ -28,4 +28,7 @@
 	void genInit( std::list< Declaration * > & translationUnit );
 
+  /// generates a single ctor/dtor statement using objDecl as the 'this' parameter and arg as the optional argument
+  ImplicitCtorDtorStmt * genCtorDtor( const std::string & fname, ObjectDecl * objDecl, Expression * arg = nullptr );
+
 	/// creates an appropriate ConstructorInit node which contains a constructor, destructor, and C-initializer
 	ConstructorInit * genCtorInit( ObjectDecl * objDecl );
