Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 680620dc0ba6821c08f8670d05f9905952c9c7d4)
+++ src/InitTweak/FixInit.cc	(revision 08da53dc33a9524abd5a449278fcad633ee0261c)
@@ -367,11 +367,12 @@
 			ImplicitCtorDtorStmt * stmt = genCtorDtor( fname, var, cpArg );
 			ExprStmt * exprStmt = strict_dynamic_cast< ExprStmt * >( stmt->get_callStmt() );
-			Expression * untyped = exprStmt->get_expr();
+			Expression * resolved = exprStmt->expr;
+			exprStmt->expr = nullptr; // take ownership of expr
 
 			// resolve copy constructor
 			// should only be one alternative for copy ctor and dtor expressions, since all arguments are fixed
 			// (VariableExpr and already resolved expression)
-			CP_CTOR_PRINT( std::cerr << "ResolvingCtorDtor " << untyped << std::endl; )
-			Expression * resolved = ResolvExpr::findVoidExpression( untyped, indexer );
+			CP_CTOR_PRINT( std::cerr << "ResolvingCtorDtor " << resolved << std::endl; )
+			ResolvExpr::findVoidExpression( resolved, indexer );
 			assert( resolved );
 			if ( resolved->get_env() ) {
@@ -381,5 +382,4 @@
 				resolved->set_env( nullptr );
 			} // if
-
 			delete stmt;
 			return resolved;
@@ -1112,5 +1112,5 @@
 		}
 
-		DeclarationWithType * MutatingResolver::mutate( ObjectDecl *objectDecl ) {
+		DeclarationWithType * MutatingResolver::mutate( ObjectDecl * objectDecl ) {
 			// add object to the indexer assumes that there will be no name collisions
 			// in generated code. If this changes, add mutate methods for entities with
@@ -1120,6 +1120,8 @@
 		}
 
-		Expression* MutatingResolver::mutate( UntypedExpr *untypedExpr ) {
-			return strict_dynamic_cast< ApplicationExpr * >( ResolvExpr::findVoidExpression( untypedExpr, indexer ) );
+		Expression * MutatingResolver::mutate( UntypedExpr * untypedExpr ) {
+			Expression * newExpr = untypedExpr;
+			ResolvExpr::findVoidExpression( newExpr, indexer );
+			return newExpr;
 		}
 
@@ -1146,8 +1148,7 @@
 
 			// resolve assignment and dispose of new env
-			Expression * resolvedAssign = ResolvExpr::findVoidExpression( assign, indexer );
-			delete resolvedAssign->env;
-			resolvedAssign->env = nullptr;
-			delete assign;
+			ResolvExpr::findVoidExpression( assign, indexer );
+			delete assign->env;
+			assign->env = nullptr;
 
 			// for constructor expr:
@@ -1158,5 +1159,5 @@
 			//   T & tmp;
 			//   &tmp = &x, ?{}(tmp), tmp
-			CommaExpr * commaExpr = new CommaExpr( resolvedAssign, new CommaExpr( callExpr, new VariableExpr( tmp ) ) );
+			CommaExpr * commaExpr = new CommaExpr( assign, new CommaExpr( callExpr, new VariableExpr( tmp ) ) );
 			commaExpr->set_env( env );
 			return commaExpr;
