Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 661214c6b8b7c19f5f12c7aea985fe5e265c5ab1)
+++ src/GenPoly/Box.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
@@ -860,9 +860,7 @@
 			// do not carry over attributes to real type parameters/return values
 			for ( DeclarationWithType * dwt : realType->parameters ) {
-				deleteAll( dwt->get_type()->attributes );
 				dwt->get_type()->attributes.clear();
 			}
 			for ( DeclarationWithType * dwt : realType->returnVals ) {
-				deleteAll( dwt->get_type()->attributes );
 				dwt->get_type()->attributes.clear();
 			}
@@ -985,5 +983,4 @@
 			} // if
 			appExpr->get_args().clear();
-			delete appExpr;
 			return addAssign;
 		}
@@ -1016,5 +1013,4 @@
 						} // if
 						if ( baseType1 || baseType2 ) {
-							delete ret->get_result();
 							ret->set_result( appExpr->get_result()->clone() );
 							if ( appExpr->get_env() ) {
@@ -1023,5 +1019,4 @@
 							} // if
 							appExpr->get_args().clear();
-							delete appExpr;
 							return ret;
 						} // if
@@ -1033,5 +1028,4 @@
 							Expression *ret = appExpr->get_args().front();
 							// fix expr type to remove pointer
-							delete ret->get_result();
 							ret->set_result( appExpr->get_result()->clone() );
 							if ( appExpr->get_env() ) {
@@ -1040,5 +1034,4 @@
 							} // if
 							appExpr->get_args().clear();
-							delete appExpr;
 							return ret;
 						} // if
@@ -1180,5 +1173,4 @@
 						Expression *ret = expr->args.front();
 						expr->args.clear();
-						delete expr;
 						return ret;
 					} // if
@@ -1214,8 +1206,6 @@
 			if ( polytype || needs ) {
 				Expression *ret = addrExpr->arg;
-				delete ret->result;
 				ret->result = addrExpr->result->clone();
 				addrExpr->arg = nullptr;
-				delete addrExpr;
 				return ret;
 			} else {
@@ -1227,5 +1217,4 @@
 			if ( retval && returnStmt->expr ) {
 				assert( returnStmt->expr->result && ! returnStmt->expr->result->isVoid() );
-				delete returnStmt->expr;
 				returnStmt->expr = nullptr;
 			} // if
@@ -1270,5 +1259,4 @@
 				}
 			}
-//  deleteAll( functions );
 		}
 
@@ -1290,5 +1278,4 @@
 			for ( Declaration * param : functionDecl->type->parameters ) {
 				if ( ObjectDecl * obj = dynamic_cast< ObjectDecl * >( param ) ) {
-					delete obj->init;
 					obj->init = nullptr;
 				}
@@ -1499,7 +1486,5 @@
 							// polymorphic aggregate members should be converted into monomorphic members.
 							// Using char[size_T] here respects the expected sizing rules of an aggregate type.
-							Type * newType = polyToMonoType( field->type );
-							delete field->type;
-							field->type = newType;
+							field->type = polyToMonoType( field->type );
 						}
 					}
@@ -1524,5 +1509,4 @@
 					stmtsToAddBefore.push_back( new DeclStmt( newBuf ) );
 
-					delete objectDecl->get_init();
 					objectDecl->set_init( new SingleInit( new VariableExpr( newBuf ) ) );
 				}
@@ -1603,6 +1587,4 @@
 			}
 
-			delete memberType;
-			delete memberExpr;
 			return newMemberExpr;
 		}
@@ -1624,5 +1606,4 @@
 						addrExpr->arg = nullptr;
 						std::swap( addrExpr->env, ret->env );
-						delete addrExpr;
 						return ret;
 					}
@@ -1750,7 +1731,5 @@
 			Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result();
 			if ( findGeneric( ty ) ) {
-				Expression *ret = new NameExpr( sizeofName( mangleType( ty ) ) );
-				delete sizeofExpr;
-				return ret;
+				return new NameExpr( sizeofName( mangleType( ty ) ) );
 			}
 			return sizeofExpr;
@@ -1760,7 +1739,5 @@
 			Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result();
 			if ( findGeneric( ty ) ) {
-				Expression *ret = new NameExpr( alignofName( mangleType( ty ) ) );
-				delete alignofExpr;
-				return ret;
+				return new NameExpr( alignofName( mangleType( ty ) ) );
 			}
 			return alignofExpr;
@@ -1777,10 +1754,7 @@
 				if ( i == -1 ) return offsetofExpr;
 
-				Expression *offsetInd = makeOffsetIndex( ty, i );
-				delete offsetofExpr;
-				return offsetInd;
+				return makeOffsetIndex( ty, i );
 			} else if ( dynamic_cast< UnionInstType* >( ty ) ) {
 				// all union members are at offset zero
-				delete offsetofExpr;
 				return new ConstantExpr( Constant::from_ulong( 0 ) );
 			} else return offsetofExpr;
@@ -1822,5 +1796,4 @@
 			}
 
-			delete offsetPackExpr;
 			return ret;
 		}
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 661214c6b8b7c19f5f12c7aea985fe5e265c5ab1)
+++ src/GenPoly/InstantiateGeneric.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
@@ -58,6 +58,4 @@
 
 		TypeList& operator= ( const TypeList &that ) {
-			deleteAll( params );
-
 			params.clear();
 			cloneAll( that.params, params );
@@ -67,6 +65,4 @@
 
 		TypeList& operator= ( TypeList &&that ) {
-			deleteAll( params );
-
 			params = std::move( that.params );
 
@@ -74,5 +70,5 @@
 		}
 
-		~TypeList() { deleteAll( params ); }
+		~TypeList() {}
 
 		bool operator== ( const TypeList& that ) const {
@@ -293,5 +289,4 @@
 	/// Strips the instances's type parameters
 	void stripInstParams( ReferenceToType *inst ) {
-		deleteAll( inst->get_parameters() );
 		inst->get_parameters().clear();
 	}
@@ -300,6 +295,4 @@
 		substituteMembers( base->get_members(), baseParams, typeSubs );
 
-		// xxx - can't delete type parameters because they may have assertions that are used
-		// deleteAll( baseParams );
 		baseParams.clear();
 
@@ -380,5 +373,4 @@
 			newInst->set_baseStruct( concDecl );
 
-			delete inst;
 			inst = newInst;
 			break;
@@ -390,5 +382,4 @@
 		}
 
-		deleteAll( typeSubs );
 		return inst;
 	}
@@ -430,5 +421,4 @@
 			newInst->set_baseUnion( concDecl );
 
-			delete inst;
 			inst = newInst;
 			break;
@@ -439,5 +429,4 @@
 		}
 
-		deleteAll( typeSubs );
 		return inst;
 	}
@@ -477,5 +466,4 @@
 			ResolvExpr::adjustExprType( ret->result ); // pointer decay
 			std::swap( ret->env, memberExpr->env );
-			delete memberExpr;
 			return ret;
 		}
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 661214c6b8b7c19f5f12c7aea985fe5e265c5ab1)
+++ src/GenPoly/Lvalue.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
@@ -50,5 +50,4 @@
 				assertf( base, "expected pointer type in dereference (type was %s)", toString( arg->result ).c_str() );
 				ApplicationExpr * ret = new ApplicationExpr( deref, { arg } );
-				delete ret->result;
 				ret->result = base->clone();
 				ret->result->set_lvalue( true );
@@ -171,5 +170,4 @@
 					return ret;
 				}
-				delete result;
 			}
 			return appExpr;
@@ -214,7 +212,5 @@
 							Type * baseType = InitTweak::getPointerBase( arg->get_result() );
 							assertf( baseType, "parameter is reference, arg must be pointer or reference: %s", toString( arg->get_result() ).c_str() );
-							PointerType * ptrType = new PointerType( Type::Qualifiers(), baseType->clone() );
-							delete arg->get_result();
-							arg->set_result( ptrType );
+							arg->set_result( new PointerType{ Type::Qualifiers(), baseType->clone() } );
 							arg = mkDeref( arg );
 						}
@@ -294,5 +290,4 @@
 						)
 						callExpr = new AddressExpr( callExpr ); // this doesn't work properly for multiple casts
-						delete callExpr->get_result();
 						callExpr->set_result( refType->clone() );
 						// move environment out to new top-level
@@ -300,5 +295,4 @@
 						castExpr->set_arg( nullptr );
 						castExpr->set_env( nullptr );
-						delete castExpr;
 						return callExpr;
 					}
@@ -318,5 +312,4 @@
 						}
 						ret->env = castExpr->env;
-						delete ret->result;
 						ret->result = castExpr->result;
 						ret->result->set_lvalue( true ); // ensure result is lvalue
@@ -324,5 +317,4 @@
 						castExpr->arg = nullptr;
 						castExpr->result = nullptr;
-						delete castExpr;
 						return ret;
 					} else if ( diff > 0 ) {
@@ -333,10 +325,8 @@
 						}
 						ret->env = castExpr->env;
-						delete ret->result;
 						ret->result = castExpr->result;
 						castExpr->env = nullptr;
 						castExpr->arg = nullptr;
 						castExpr->result = nullptr;
-						delete castExpr;
 						return ret;
 					}
@@ -360,10 +350,8 @@
 					}
 					ret->env = castExpr->env;
-					delete ret->result;
 					ret->result = castExpr->result;
 					castExpr->env = nullptr;
 					castExpr->arg = nullptr;
 					castExpr->result = nullptr;
-					delete castExpr;
 					return ret;
 				} else {
@@ -390,5 +378,4 @@
 					ret->result->set_lvalue( true );  // ensure result is lvalue
 					castExpr->arg = nullptr;
-					delete castExpr;
 				} else {
 					// must keep cast if types are different
@@ -407,5 +394,4 @@
 			Type::Qualifiers qualifiers = refType->get_qualifiers();
 			refType->set_base( nullptr );
-			delete refType;
 			return new PointerType( qualifiers, base );
 		}
@@ -419,5 +405,4 @@
 				ret->set_env( expr->get_env() );
 				expr->set_env( nullptr );
-				delete expr;
 				return ret;
 			} else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( arg ) ) {
@@ -428,5 +413,4 @@
 				ret->set_env( expr->get_env() );
 				expr->set_env( nullptr );
-				delete expr;
 
 				// conditional expr type may not be either of the argument types, need to unify
@@ -461,5 +445,4 @@
 					arg0 = nullptr;
 					addrExpr->set_env( nullptr );
-					delete addrExpr;
 					return ret;
 				}
@@ -491,5 +474,4 @@
 						addrExpr->set_arg( nullptr );
 						appExpr->set_env( nullptr );
-						delete appExpr;
 						return ret;
 					}
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision 661214c6b8b7c19f5f12c7aea985fe5e265c5ab1)
+++ src/GenPoly/ScrubTyVars.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
@@ -28,10 +28,7 @@
 		if ( ! tyVars ) {
 			if ( typeInst->get_isFtype() ) {
-				delete typeInst;
-				return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) );
+				return new PointerType{ Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) };
 			} else {
-				PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) );
-				delete typeInst;
-				return ret;
+				return new PointerType{ Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) };
 			}
 		}
@@ -42,12 +39,7 @@
 			  case TypeDecl::Dtype:
 			  case TypeDecl::Ttype:
-				{
-					PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) );
-					delete typeInst;
-					return ret;
-				}
+				return new PointerType{ Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) };
 			  case TypeDecl::Ftype:
-				delete typeInst;
-				return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) );
+				return new PointerType{ Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) };
 			} // switch
 		} // if
@@ -57,7 +49,5 @@
 	Type * ScrubTyVars::mutateAggregateType( Type * ty ) {
 		if ( shouldScrub( ty ) ) {
-			PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( ty->get_qualifiers() ) );
-			delete ty;
-			return ret;
+			return new PointerType{ Type::Qualifiers(), new VoidType( ty->get_qualifiers() ) };
 		}
 		return ty;
@@ -104,6 +94,4 @@
 			Type * ret = dynType->acceptMutator( *visitor );
 			ret->get_qualifiers() |= pointer->get_qualifiers();
-			pointer->base = nullptr;
-			delete pointer;
 			return ret;
 		}
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 661214c6b8b7c19f5f12c7aea985fe5e265c5ab1)
+++ src/GenPoly/Specialize.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
@@ -193,5 +193,4 @@
 				explodeSimple( new TupleIndexExpr( expr->clone(), i ), out );
 			}
-			delete expr;
 		} else {
 			// non-tuple type - output a clone of the expression
