Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 1057e3d8bcc7079dd12b9f5c639b27de59e0e393)
+++ src/SymTab/Autogen.cc	(revision 184557ed94d1cdbdc6fd685e497e5375f8968a96)
@@ -214,5 +214,4 @@
 	void addForwardDecl( FunctionDecl * functionDecl, std::list< Declaration * > & declsToAdd ) {
 		FunctionDecl * decl = functionDecl->clone();
-		delete decl->statements;
 		decl->statements = nullptr;
 		declsToAdd.push_back( decl );
@@ -333,5 +332,4 @@
 		} catch ( SemanticErrorException & ) {
 			// okay if decl does not resolve - that means the function should not be generated
-			delete dcl;
 		}
 	}
@@ -373,5 +371,4 @@
 			// do not carry over field's attributes to parameter type
 			Type * paramType = field->get_type()->clone();
-			deleteAll( paramType->attributes );
 			paramType->attributes.clear();
 			// add a parameter corresponding to this field
@@ -383,5 +380,4 @@
 			resolve( ctor );
 		}
-		delete memCtorType;
 	}
 
@@ -511,5 +507,4 @@
 			// do not carry over field's attributes to parameter type
 			Type * paramType = field->get_type()->clone();
-			deleteAll( paramType->attributes );
 			paramType->attributes.clear();
 			// add a parameter corresponding to this field
@@ -524,5 +519,4 @@
 			break;
 		}
-		delete memCtorType;
 	}
 
@@ -594,7 +588,7 @@
 		// must visit children (enum constants) to add them to the indexer
 		if ( enumDecl->has_body() ) {
-			EnumInstType enumInst( Type::Qualifiers(), enumDecl->get_name() );
-			enumInst.set_baseEnum( enumDecl );
-			EnumFuncGenerator gen( &enumInst, data, functionNesting, indexer );
+			auto enumInst = new EnumInstType{ Type::Qualifiers(), enumDecl->get_name() };
+			enumInst->set_baseEnum( enumDecl );
+			EnumFuncGenerator gen( enumInst, data, functionNesting, indexer );
 			generateFunctions( gen, declsToAddAfter );
 		}
@@ -604,10 +598,10 @@
 		visit_children = false;
 		if ( structDecl->has_body() ) {
-			StructInstType structInst( Type::Qualifiers(), structDecl->name );
-			structInst.set_baseStruct( structDecl );
+			auto structInst = new StructInstType{ Type::Qualifiers(), structDecl->name };
+			structInst->set_baseStruct( structDecl );
 			for ( TypeDecl * typeDecl : structDecl->parameters ) {
-				structInst.parameters.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeDecl->name, typeDecl ) ) );
-			}
-			StructFuncGenerator gen( structDecl, &structInst, data, functionNesting, indexer );
+				structInst->parameters.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeDecl->name, typeDecl ) ) );
+			}
+			StructFuncGenerator gen( structDecl, structInst, data, functionNesting, indexer );
 			generateFunctions( gen, declsToAddAfter );
 		} // if
@@ -617,10 +611,10 @@
 		visit_children = false;
 		if ( unionDecl->has_body()  ) {
-			UnionInstType unionInst( Type::Qualifiers(), unionDecl->get_name() );
-			unionInst.set_baseUnion( unionDecl );
+			auto unionInst = new UnionInstType{ Type::Qualifiers(), unionDecl->get_name() };
+			unionInst->set_baseUnion( unionDecl );
 			for ( TypeDecl * typeDecl : unionDecl->get_parameters() ) {
-				unionInst.get_parameters().push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), typeDecl ) ) );
-			}
-			UnionFuncGenerator gen( unionDecl, &unionInst, data, functionNesting, indexer );
+				unionInst->get_parameters().push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), typeDecl ) ) );
+			}
+			UnionFuncGenerator gen( unionDecl, unionInst, data, functionNesting, indexer );
 			generateFunctions( gen, declsToAddAfter );
 		} // if
@@ -631,6 +625,6 @@
 		if ( ! typeDecl->base ) return;
 
-		TypeInstType refType( Type::Qualifiers(), typeDecl->name, typeDecl );
-		TypeFuncGenerator gen( typeDecl, &refType, data, functionNesting, indexer );
+		auto refType = new TypeInstType{ Type::Qualifiers(), typeDecl->name, typeDecl };
+		TypeFuncGenerator gen( typeDecl, refType, data, functionNesting, indexer );
 		generateFunctions( gen, declsToAddAfter );
 
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision 1057e3d8bcc7079dd12b9f5c639b27de59e0e393)
+++ src/SymTab/Autogen.h	(revision 184557ed94d1cdbdc6fd685e497e5375f8968a96)
@@ -97,5 +97,4 @@
 		// return if adding reference fails - will happen on default constructor and destructor
 		if ( isReferenceCtorDtor && ! srcParam.addReference() ) {
-			delete fExpr;
 			return listInit;
 		}
Index: src/SymTab/FixFunction.cc
===================================================================
--- src/SymTab/FixFunction.cc	(revision 1057e3d8bcc7079dd12b9f5c639b27de59e0e393)
+++ src/SymTab/FixFunction.cc	(revision 184557ed94d1cdbdc6fd685e497e5375f8968a96)
@@ -28,10 +28,8 @@
 
 	DeclarationWithType * FixFunction::postmutate(FunctionDecl *functionDecl) {
-		// can't delete function type because it may contain assertions, so transfer ownership to new object
-		ObjectDecl *pointer = new ObjectDecl( functionDecl->name, functionDecl->get_storageClasses(), functionDecl->linkage, nullptr, new PointerType( Type::Qualifiers(), functionDecl->type ), nullptr, functionDecl->attributes );
-		functionDecl->attributes.clear();
-		functionDecl->type = nullptr;
-		delete functionDecl;
-		return pointer;
+		return new ObjectDecl{ 
+			functionDecl->name, functionDecl->get_storageClasses(), functionDecl->linkage, nullptr, 
+			new PointerType{ Type::Qualifiers(), functionDecl->type }, 
+			nullptr, functionDecl->attributes };
 	}
 
@@ -42,9 +40,5 @@
 	Type * FixFunction::postmutate(ArrayType *arrayType) {
 		// need to recursively mutate the base type in order for multi-dimensional arrays to work.
-		PointerType *pointerType = new PointerType( arrayType->get_qualifiers(), arrayType->base, arrayType->dimension, arrayType->isVarLen, arrayType->isStatic );
-		arrayType->base = nullptr;
-		arrayType->dimension = nullptr;
-		delete arrayType;
-		return pointerType;
+		return new PointerType{ arrayType->get_qualifiers(), arrayType->base, arrayType->dimension, arrayType->isVarLen, arrayType->isStatic };
 	}
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 1057e3d8bcc7079dd12b9f5c639b27de59e0e393)
+++ src/SymTab/Validate.cc	(revision 184557ed94d1cdbdc6fd685e497e5375f8968a96)
@@ -48,4 +48,5 @@
 #include "CodeGen/CodeGenerator.h"     // for genName
 #include "CodeGen/OperatorTable.h"     // for isCtorDtor, isCtorDtorAssign
+#include "Common/GC.h"                 // for new_static_root, register_static_root
 #include "ControlStruct/Mutate.h"      // for ForExprMutator
 #include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
@@ -199,6 +200,5 @@
 		void addImplicitTypedef( AggDecl * aggDecl );
 
-		typedef std::unique_ptr<TypedefDecl> TypedefDeclPtr;
-		typedef ScopedMap< std::string, std::pair< TypedefDeclPtr, int > > TypedefMap;
+		typedef ScopedMap< std::string, std::pair< TypedefDecl*, int > > TypedefMap;
 		typedef std::map< std::string, TypeDecl * > TypeDeclMap;
 		TypedefMap typedefNames;
@@ -313,5 +313,5 @@
 		} // if
 		// Always remove the hoisted aggregate from the inner structure.
-		GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist, false ); } );
+		GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist ); } );
 	}
 
@@ -374,5 +374,4 @@
 			// one void is the only thing in the list; remove it.
 			if ( containsVoid ) {
-				delete dwts.front();
 				dwts.clear();
 			}
@@ -501,5 +500,4 @@
 				}
 			}
-			deleteAll( td->assertions );
 			td->assertions.clear();
 		} // for
@@ -617,5 +615,4 @@
 					// expand trait instance into all of its members
 					expandAssertions( traitInst, back_inserter( type->assertions ) );
-					delete traitInst;
 				} else {
 					// pass other assertions through
@@ -689,10 +686,12 @@
 			// grab and remember declaration of size_t
 			SizeType = eliminator.pass.typedefNames["size_t"].first->get_base()->clone();
+			GC::get().register_static_root( SizeType );
 		} else {
 			// xxx - missing global typedef for size_t - default to long unsigned int, even though that may be wrong
 			// eventually should have a warning for this case.
-			SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
-		}
-		filter( translationUnit, isTypedef, true );
+			SizeType = 
+				new_static_root<BasicType>( Type::Qualifiers(), BasicType::LongUnsignedInt );
+		}
+		filter( translationUnit, isTypedef );
 	}
 
@@ -708,5 +707,4 @@
 				ret->attributes.splice( ret->attributes.end(), typeInst->attributes );
 			} else {
-				deleteAll( ret->attributes );
 				ret->attributes.clear();
 			}
@@ -721,5 +719,4 @@
 				mutateAll( rtt->parameters, *visitor );  // recursively fix typedefs on parameters
 			} // if
-			delete typeInst;
 			return ret;
 		} else {
@@ -763,5 +760,5 @@
 			}
 		} else {
-			typedefNames[ tyDecl->get_name() ] = std::make_pair( TypedefDeclPtr( tyDecl ), scopeLevel );
+			typedefNames[ tyDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
 		} // if
 
@@ -807,9 +804,7 @@
 		if ( FunctionType *funtype = dynamic_cast<FunctionType *>( objDecl->get_type() ) ) { // function type?
 			// replace the current object declaration with a function declaration
-			FunctionDecl * newDecl = new FunctionDecl( objDecl->get_name(), objDecl->get_storageClasses(), objDecl->get_linkage(), funtype, 0, objDecl->get_attributes(), objDecl->get_funcSpec() );
-			objDecl->get_attributes().clear();
-			objDecl->set_type( nullptr );
-			delete objDecl;
-			return newDecl;
+			return new FunctionDecl{ 
+				objDecl->get_name(), objDecl->get_storageClasses(), objDecl->get_linkage(), 
+				funtype, 0, objDecl->get_attributes(), objDecl->get_funcSpec() };
 		} // if
 		return objDecl;
@@ -835,5 +830,5 @@
 			} // if
 			return false;
-		}, true);
+		} );
 		return compoundStmt;
 	}
@@ -843,5 +838,5 @@
 	template<typename AggDecl>
 	AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
-		filter( aggDecl->members, isTypedef, true );
+		filter( aggDecl->members, isTypedef );
 		return aggDecl;
 	}
@@ -858,6 +853,6 @@
 				type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
 			} // if
-			TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() ) );
-			typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel );
+			TypedefDecl* tyDecl = new TypedefDecl{ aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() };
+			typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
 		} // if
 	}
@@ -973,8 +968,6 @@
 		static UniqueName indexName( "_compLit" );
 
-		ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() );
-		compLitExpr->set_result( nullptr );
-		compLitExpr->set_initializer( nullptr );
-		delete compLitExpr;
+		ObjectDecl * tempvar = new ObjectDecl{ 
+			indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() };
 		declsToAddBefore.push_back( tempvar );					// add modified temporary to current block
 		return new VariableExpr( tempvar );
@@ -1012,5 +1005,4 @@
 			// ensure return value is not destructed by explicitly creating an empty ListInit node wherein maybeConstruct is false.
 			ObjectDecl * newRet = new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, tupleType, new ListInit( std::list<Initializer*>(), noDesignators, false ) );
-			deleteAll( retVals );
 			retVals.clear();
 			retVals.push_back( newRet );
@@ -1053,7 +1045,5 @@
 			if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( inner->arg ) ) {
 				if ( labels.count( nameExpr->name ) ) {
-					Label name = nameExpr->name;
-					delete addrExpr;
-					return new LabelAddressExpr( name );
+					return new LabelAddressExpr{ nameExpr->name };
 				}
 			}
