Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision a0c7d5cc63c9d5379597f81031e97a8f5ec1e18b)
+++ src/InitTweak/FixGlobalInit.cc	(revision ff29f0885c5ef43cc494cdb91326ef1813825a32)
@@ -57,13 +57,9 @@
 		GlobalFixer & fixer = visitor.pass;
 		// don't need to include function if it's empty
-		if ( fixer.initFunction->get_statements()->get_kids().empty() ) {
-			delete fixer.initFunction;
-		} else {
+		if ( ! fixer.initFunction->get_statements()->get_kids().empty() ) {
 			translationUnit.push_back( fixer.initFunction );
 		} // if
 
-		if ( fixer.destroyFunction->get_statements()->get_kids().empty() ) {
-			delete fixer.destroyFunction;
-		} else {
+		if ( ! fixer.destroyFunction->get_statements()->get_kids().empty() ) {
 			translationUnit.push_back( fixer.destroyFunction );
 		} // if
@@ -130,5 +126,4 @@
 				objDecl->set_init( NULL );
 			} // if
-			delete ctorInit;
 		} // if
 	}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision a0c7d5cc63c9d5379597f81031e97a8f5ec1e18b)
+++ src/InitTweak/FixInit.cc	(revision ff29f0885c5ef43cc494cdb91326ef1813825a32)
@@ -454,5 +454,4 @@
 				resolved->env = nullptr;
 			} // if
-			delete stmt;
 			if ( TupleAssignExpr * assign = dynamic_cast< TupleAssignExpr * >( resolved ) ) {
 				// fix newly generated StmtExpr
@@ -554,8 +553,5 @@
 				result = result->clone();
 				env->apply( result );
-				if ( ! InitTweak::isConstructable( result ) ) {
-					delete result;
-					return;
-				}
+				if ( ! InitTweak::isConstructable( result ) ) return;
 
 				// create variable that will hold the result of the stmt expr
@@ -652,5 +648,4 @@
 			std::swap( impCpCtorExpr->env, callExpr->env );
 			assert( impCpCtorExpr->env == nullptr );
-			delete impCpCtorExpr;
 
 			if ( returnDecl ) {
@@ -711,7 +706,5 @@
 			if ( unqMap.count( unqExpr->get_id() ) ) {
 				// take data from other UniqueExpr to ensure consistency
-				delete unqExpr->get_expr();
 				unqExpr->set_expr( unqMap[unqExpr->get_id()]->get_expr()->clone() );
-				delete unqExpr->get_result();
 				unqExpr->set_result( maybeClone( unqExpr->get_expr()->get_result() ) );
 				if ( unqCount[ unqExpr->get_id() ] == 0 ) {  // insert destructor after the last use of the unique expression
@@ -824,7 +817,8 @@
 							// create a new object which is never used
 							static UniqueName dummyNamer( "_dummy" );
-							ObjectDecl * dummy = new ObjectDecl( dummyNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), 0, std::list< Attribute * >{ new Attribute("unused") } );
-							delete ctorInit;
-							return dummy;
+							return new ObjectDecl{
+								dummyNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, 
+								new PointerType{ Type::Qualifiers(), new VoidType( Type::Qualifiers() ) }, 
+								0, std::list< Attribute * >{ new Attribute("unused") } };
 						}
 					} else {
@@ -852,5 +846,4 @@
 					objDecl->init = nullptr;
 				} // if
-				delete ctorInit;
 			} // if
 			return objDecl;
@@ -1228,5 +1221,4 @@
 			ObjectDecl * tmp = ObjectDecl::newObject( tempNamer.newName(), callExpr->args.front()->result->clone(), nullptr );
 			declsToAddBefore.push_back( tmp );
-			delete ctorExpr;
 
 			// build assignment and replace constructor's first argument with new temporary
@@ -1237,5 +1229,4 @@
 			// resolve assignment and dispose of new env
 			ResolvExpr::findVoidExpression( assign, indexer );
-			delete assign->env;
 			assign->env = nullptr;
 
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision a0c7d5cc63c9d5379597f81031e97a8f5ec1e18b)
+++ src/InitTweak/GenInit.cc	(revision ff29f0885c5ef43cc494cdb91326ef1813825a32)
@@ -258,6 +258,6 @@
 					// generic parameters should not play a role in determining whether a generic type is constructed - construct all generic types, so that
 					// polymorphic constructors make generic types managed types
-					StructInstType inst( Type::Qualifiers(), aggregateDecl );
-					managedTypes.insert( SymTab::Mangler::mangleConcrete( &inst ) );
+					auto inst = new StructInstType( Type::Qualifiers(), aggregateDecl );
+					managedTypes.insert( SymTab::Mangler::mangleConcrete( inst ) );
 					break;
 				}
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision a0c7d5cc63c9d5379597f81031e97a8f5ec1e18b)
+++ src/InitTweak/InitTweak.cc	(revision ff29f0885c5ef43cc494cdb91326ef1813825a32)
@@ -5,4 +5,5 @@
 #include <memory>                  // for __shared_ptr
 
+#include "Common/GC.h"             // for new_static_root
 #include "Common/PassVisitor.h"
 #include "Common/SemanticError.h"  // for SemanticError
@@ -122,5 +123,5 @@
 	public:
 		ExprImpl( Expression * expr ) : arg( expr ) {}
-		virtual ~ExprImpl() { delete arg; }
+		virtual ~ExprImpl() = default;
 
 		virtual std::list< Expression * > next( std::list< Expression * > & indices ) {
@@ -166,5 +167,4 @@
 
 	void InitExpander::clearArrayIndices() {
-		deleteAll( indices );
 		indices.clear();
 	}
@@ -263,5 +263,4 @@
 		build( dst, indices.begin(), indices.end(), init, back_inserter( block->get_kids() ) );
 		if ( block->get_kids().empty() ) {
-			delete block;
 			return nullptr;
 		} else {
@@ -525,5 +524,7 @@
 			// This operator could easily exist as a real function, but it's tricky because nothing should resolve to this function.
 			TypeDecl * td = new TypeDecl( "T", noStorageClasses, nullptr, TypeDecl::Dtype, true );
-			assign = new FunctionDecl( "?=?", noStorageClasses, LinkageSpec::Intrinsic, SymTab::genAssignType( new TypeInstType( noQualifiers, td->name, td ) ), nullptr );
+			assign = new_static_root<FunctionDecl>( 
+				"?=?", noStorageClasses, LinkageSpec::Intrinsic, 
+				SymTab::genAssignType( new TypeInstType( noQualifiers, td->name, td ) ), nullptr );
 		}
 		if ( dynamic_cast< ReferenceType * >( dst->result ) ) {
