Index: src/InitTweak/RemoveInit.cc
===================================================================
--- src/InitTweak/RemoveInit.cc	(revision 071a31a897b52a4c1abdb6c4c2536e3bfe6257fb)
+++ src/InitTweak/RemoveInit.cc	(revision 620cb957290a785073ff510006fde5a9f5e92ad5)
@@ -23,4 +23,5 @@
 #include "SynTree/Initializer.h"
 #include "SynTree/Mutator.h"
+#include "SymTab/Autogen.h"
 #include "GenPoly/PolyMutator.h"
 
@@ -194,4 +195,7 @@
 				if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->get_type() ) ) {
 					// call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array
+					// TODO: walk initializer and generate appropriate copy ctor if element has initializer
+					SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "?{}", back_inserter( stmtsToAddAfter ) );
+					SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "^?{}", front_inserter( destructorStmts ), false );
 				} else {
 					// it's sufficient to attempt to call the ctor/dtor for the given object and its initializer
@@ -228,4 +232,9 @@
 
 	CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {
+		// don't want to dump all destructors when block is left,
+		// just the destructors associated with variables defined in this block
+		std::list< Statement * > oldDestructorStmts = destructorStmts;
+		destructorStmts = std::list<Statement *>();
+
 		CompoundStmt * ret = PolyMutator::mutate( compoundStmt );
 		std::list< Statement * > &statements = ret->get_kids();
@@ -235,4 +244,6 @@
 			statements.splice( statements.end(), destructorStmts );
 		} // if
+
+		destructorStmts = oldDestructorStmts;
 		return ret;
 	}
